<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Merrick Christensen&apos;s Articles</title><description>Systems thinking, engineering principles &amp; general postulations. In pursuit of the timeless and great as it pertains to accomplishing amazing things with other people.</description><link>https://www.merrickchristensen.com/</link><copyright>All rights reserved 2026, Merrick Christensen</copyright><item><title>AI is the New Medium</title><link>https://www.merrickchristensen.com/articles/ai-is-the-new-medium</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/ai-is-the-new-medium</guid><description>AI isn&apos;t just a tool for creating content within the mediums we already know. AI is the new medium.</description><pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;L&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;ike the rest&lt;/span&gt; of the world, I’ve been tinkering with AI for the last few years. For me, it started in 2021 when I gained access to OpenAI’s GPT-3. I was on my own “bachelor’s trip” at a cabin near Bear Lake in northern Utah, geeking out over how amazing these APIs were. A friend of mine had been curating data for an app he was developing⁠—one that paired groups of friends with activities⁠—and I was experimenting with using AI to seed and refine this data. I was amazed to see a machine generate data that somewhat resembled what my friend had manually curated for months.&lt;/p&gt;
&lt;p&gt;Then came image models⁠—Stable Diffusion 1.5 was my entry point. I learned how to fine-tune them using LoRA adapters and even created my own derivative checkpoints. One of my favorite projects was training models to generate images of my kids, allowing me to create custom coloring pages featuring their faces. That process led me to fine-tune LLaMA models as well, which, after quantization, I realized I could do entirely on my MacBook Pro. I experimented with training models on the writings of some of my favorite thinkers, like George MacDonald and C.S. Lewis. Then came voice models⁠—having my kids sing “Go Bananas, Go Go Bananas” and hearing it come out in Joe Biden’s voice was absolutely hilarious.&lt;/p&gt;
&lt;p&gt;&lt;audio controls src=&quot;https://www.merrickchristensen.com/assets/audio/articles/ai-is-a-new-medium/bananas.mp3&quot;&gt;&lt;a href=&quot;https://www.merrickchristensen.com/assets/audio/articles/ai-is-a-new-medium/bananas.mp3&quot;&gt;Listen to “Go Bananas, Go Go Bananas.”&lt;/a&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;After my brother passed away in 2022, I almost trained models on his texts, voice, and pictures so that I could continue to experience some version of him. However, I knew at best, I’d only be creating a distorted caricature of him to avoid my own grief. A caricature that couldn’t hold a candle to the real him with his completely unpredictable humor and uniqueness. Frankly, I don’t know if there is a model that is both uncensored and completely loving &amp;amp; accepting enough to serve as a foundation for a caricature of that man. He was a human paradox. No human fits neatly into the dimensions of personality we strive to force them into. They can be wild and calming, irreverent and safe, prideful and utterly human, and most of all, unpredictable. The people in our lives are unmistakably “other” and what we know of them is a fragment of the infinitude of who they are and it’s pitiful to think that can be compressed into a set of numbers. Still, I suppose it’s only natural to reach for the tools we have to relieve our grief⁠—after all, people have been doing it with photos and videos for years.&lt;/p&gt;
&lt;p&gt;Another area where AI had a dark side for me was how mindlessly I started using it. I had it generate bedtime stories for my kids instead of making up my own. I pasted in code snippets, tweaking AI-generated solutions until something worked, only then did I bother putting in the effort to understand why I had a problem in the first place. I copied errors from my software without even reading them. It became so useful that I noticed my brain starting to under-function. I used to tell personalized, creative stories to my kids before bed. I used to write code with monochrome syntax highlighting to focus purely on the structure. I designed software in my head and my unit tests before implementing it. I always made sure I knew the “why” behind every bug. (That habit, thankfully, never died.) I realized that over-functioning with AI was a slippery slope to under-functioning myself.&lt;/p&gt;
&lt;p&gt;Recently, I’ve been reflecting on how I use AI, and a book helped crystallize my thoughts: Brave New Words by Sal Khan. The book opens with Sal’s daughter co-authoring a story with AI. This subtle change, where the AI cooperates with the human asking them to take part in the writing is such a meaningful improvement versus having AI write the whole story as I’ve done for my kids. Generalizing this idea to have AI collaborate with you, rather than work on behalf of you leads to a more enriching use of the tools. GPT Tasks have helped me take this “flip the script” approach to another level.&lt;/p&gt;
&lt;p&gt;I’ve started using GPT Tasks in this way. Every morning, AI asks me a systems design, programming, or computer science question. It then reviews my response, points out errors in my thinking, and highlights learning opportunities. This gives me the chance to articulate my understanding and immediately receive feedback from an infinitely patient tutor. Already, I feel like I’ve learned more from this approach than from using AI as a crutch to hurry through debugging.&lt;/p&gt;
&lt;p&gt;Another example is using AI for writing feedback. Instead of having it draft documents for me, I write the initial draft and then ask AI, “I’ve written the following document for purpose X. What considerations have I missed? What are the best counterarguments?” This allows me to reap the cognitive benefits of writing⁠—mental clarity and deep thinking⁠—while refining my message and considering alternative perspectives. Besides, writing with my own voice and personality makes my work worth reading, unlike the sterile, alienatingly boringly perfect output AI often produces.&lt;/p&gt;
&lt;p&gt;They say that whenever a new medium emerges, people first use it to replicate the old ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Film → Theater: Early films were static, staged-like plays with a single camera angle.&lt;/li&gt;
&lt;li&gt;TV → Radio: Early television shows were essentially filmed radio programs.&lt;/li&gt;
&lt;li&gt;Web → Print: Early websites mimicked newspapers, with rigid layouts and no interactivity.&lt;/li&gt;
&lt;li&gt;Streaming → Cable: Early streaming platforms copied TV schedules and weekly episode releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this same vein, I was using AI to mimic exactly what I had been doing before⁠—just through a new medium. I created bedtime stories, so I had AI create bedtime stories. I made silly Photoshop edits of my kids, so I had AI generate silly images of them. I wrote code and fixed errors, so I had AI write code and fix errors. I was treating AI as a tool to bridge into familiar territories rather than recognizing it as something entirely new.&lt;/p&gt;
&lt;p&gt;I’m starting to see AI not just as a tool, but as a new medium⁠—one that unlocks entirely new types of experiences. Instead of simply answering my questions, AI can help me ask better ones. Instead of generating my writing, it can challenge and refine my thoughts. In this role, AI becomes less like a crutch and more like a mentor⁠—one that pushes me to grow rather than shrink. Before, AI was a bit like a pet genie on a chain⁠—immensely powerful, tempting me to let it do more and more while I become smaller in its shadow. The real danger isn’t that AI is too powerful, but that it can make us less powerful if we use it passively. If we let it generate for us rather than provoke us, if we let it replace curiosity instead of fueling it, we risk shrinking into lazy consumers. AI can either diminish us or stretch us into something greater than we were before. The choice is ours: do we hold the chain and wither, or do we show self-discipline, put in the work, and use this genie to help us thrive?&lt;/p&gt;
&lt;p&gt;AI isn’t just a tool for creating content within the mediums we already know. AI is the new medium. Try flipping the script and see what happens.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Webflow Design Language</title><link>https://www.merrickchristensen.com/articles/webflow-design-language</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/webflow-design-language</guid><description>Learn about the structurally edited language that powers sites built with Webflow.</description><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;I&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;&lt;/span&gt; finally got the chance to talk about the core of what I’ve worked on at Webflow for the past 7 years. We evolved a programming language that is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Projectionally edited (modify the code by directly modifying the result). Direct manipulation is at the heart of No Code.&lt;/li&gt;
&lt;li&gt;Foreign function interfacing (FFI) to interoperate with JavaScript. This lets Webflow provide code that our customers can visually consume. For example, date formatting functions or other JavaScript values.&lt;/li&gt;
&lt;li&gt;Host extensible type system with typed holes and inference that enables our team to provide unique custom visual editing interfaces that offer bindings out of the box with full support for type aliases that provide tailored editing experiences for the same underlying type. A good way to visualize this is a phone number editing experience being different than that of an email, but they’re both ultimately strings.&lt;/li&gt;
&lt;li&gt;Pure evaluation which enables many of our interactive live evaluation and debugging experiences.&lt;/li&gt;
&lt;li&gt;Holes which enable us to support live editing, even if values are missing or corrupt.&lt;/li&gt;
&lt;li&gt;Replaying computations without executing effects again and so much more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Webflow Design Language is the DNA of a Webflow site and its design decisions facilitate our visual editing experience. Read about it on our engineering blog &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://webflow.com/blog/webflow-design-language&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Using Webflow with Netlify</title><link>https://www.merrickchristensen.com/articles/using-webflow-and-netlify</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/using-webflow-and-netlify</guid><description>Configure Netlify to send particular routes to Webflow so that you can selectively serve pages that are designed and hosted on Webflow.</description><pubDate>Sat, 10 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;W&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;ebflow is hard&lt;/span&gt; to beat as a solution for the marketing site for your
application. Netlify is a great CI/CD &amp;amp; hosting option for your front-end
application. This article briefly shows how to configure Netlify to send
particular routes to Webflow so that you can selectively serve pages that are
designed and hosted on Webflow.&lt;/p&gt;
&lt;p&gt;We want some URLs served directly by Netlify for our application and other URLs
served by Webflow for marketing.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;merrickchristensen&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
            👈
Hosted on Webflow&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;merrickchristensen&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;   👈 Hosted on Netlify&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;1-point-your-desired-domain-to-netlify&quot;&gt;&lt;a href=&quot;#1-point-your-desired-domain-to-netlify&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;1. Point Your Desired Domain to Netlify&lt;/h3&gt;
&lt;p&gt;Set your custom domain up with Netlify, follow
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.netlify.com/domains-https/custom-domains/&quot;&gt;Netlify’s official custom domain instructions&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;2-setup-a-subdomain-for-webflow&quot;&gt;&lt;a href=&quot;#2-setup-a-subdomain-for-webflow&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;2. Setup a Subdomain For Webflow&lt;/h3&gt;
&lt;p&gt;Connect a custom subdomain to Webflow, follow
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://university.webflow.com/lesson/connect-a-subdomain&quot;&gt;Webflow’s official subdomain setup instructions&lt;/a&gt;,
as part of this setup you’ll be asked to create a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CNAME&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; record that points to
Webflow. In my case, I use Netlify as my name servers, so I setup a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.netlify.com/domains-https/netlify-dns/dns-records/#add-a-new-record&quot;&gt;CNAME record in Netlify&lt;/a&gt;.
Don’t worry, your subdomain won’t be what your customers see, so the actual
subdomain doesn’t matter much.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;img src=&quot;/assets/images/articles/using-webflow-and-netlify/netlify-domain.png&quot; alt=&quot;Netlify CNAME Settings Example&quot;/&gt;&lt;figcaption&gt;Netlify CNAME Settings Example&lt;/figcaption&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;Netlify Subdomain Settings&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;img src=&quot;/assets/images/articles/using-webflow-and-netlify/webflow-domain.png&quot; alt=&quot;Webflow Subdomain Added to Project&quot;/&gt;&lt;figcaption&gt;Webflow Subdomain Added to Project&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;If you go to the subdomain directly it should be publicly available and served
by Webflow. All good, let’s look at sharing a domain between the two.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;3-send-traffic-for-desired-pages-to-webflow-using-netlify-proxies&quot;&gt;&lt;a href=&quot;#3-send-traffic-for-desired-pages-to-webflow-using-netlify-proxies&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;3. Send Traffic For Desired Pages To Webflow Using Netlify Proxies&lt;/h3&gt;
&lt;p&gt;Using Netlify &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.netlify.com/routing/redirects/&quot;&gt;redirects&lt;/a&gt; &amp;amp;
specifically,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.netlify.com/routing/redirects/rewrites-proxies/#proxy-to-another-service&quot;&gt;proxies&lt;/a&gt;
we can selectively proxy certain URL paths to our Webflow site. The key to
making Netlify proxy requests is to use the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; status code. The syntax for a
proxy directive, which would go in your Netlify &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;_redirects&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; file, is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;full-url-to-proxy&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;status-code&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So to send the traffic of our homepage to our Webflow site we can add the
following directive.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/ https:/&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;marketing&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;merrickchristensen&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will send all traffic to the root page from the domain hosted by Netlify,
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;merrickchristensen&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to our Webflow site.&lt;/p&gt;
&lt;p&gt;We can route other pages to, we can also take advantage of Netlify &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;splat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
syntax to support Webflow CMS URLs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/  https:/&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;marketing&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;merrickchristensen&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;contact&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;us&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//marketing-site.merrickchristensen.com/contact-us 200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/blog/&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;splat&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//marketing-site.merrickchristensen.com/blog/:splat  200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                                                         &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;^&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                                                         &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;splat&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;groups&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;part&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;be&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;used&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;redirect&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;primarily&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;useful&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;supporting&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CMS&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Webflow&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All of your other URLs will be handled by Netlify by default.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;trade-offs&quot;&gt;&lt;a href=&quot;#trade-offs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Trade Offs&lt;/h3&gt;
&lt;p&gt;In addition to building really fast websites, Webflow has really fast hosting.
Webflow will serve pages using a CDN which means that your customers will get
your site delivered to them by a server near them which means they’ll see your
site faster. Unfortunately, the proxy setup goes through Netlify first which
means we are making one additional hop from Netlify to Webflow so there will be
some additional latency. To be honest, for most usecases this latency is really
minimal and negligible. In my minimal testing, proxying through Netlify added
roughly 50-100 milliseconds to the request.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>JSON Lisp</title><link>https://www.merrickchristensen.com/articles/json-lisp</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/json-lisp</guid><description>Learn about how programming languages work as we design &amp; implement a little Lisp-like language called JSON Lisp.</description><pubDate>Mon, 03 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;L&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;isp is a&lt;/span&gt; programming language that is often used didactically in higher
education for its simplicity and minimal syntax. Sounds fancy, right? I wouldn’t
know to be honest, and I didn’t make it all the way through the third grade to
have you judge me.&lt;/p&gt;
&lt;p&gt;Anyways, in a few paragraphs, you’ll be able to read &amp;amp; write Lisp! By the end of
this article we’ll have implemented Lisp style evaluation with our programs
provided as JSON, or JSON Lisp™, to be precise.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;lisp-crash-course&quot;&gt;&lt;a href=&quot;#lisp-crash-course&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Lisp Crash Course&lt;/h2&gt;
&lt;p&gt;If you’re familiar with Lisp feel free to skip this crash course introduction
and jump straight to JSON Lisp where stuff gets weird.&lt;/p&gt;
&lt;h3 id=&quot;symbolic-expressions-s-expressions&quot;&gt;&lt;a href=&quot;#symbolic-expressions-s-expressions&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Symbolic Expressions (S-expressions)&lt;/h3&gt;
&lt;p&gt;Lisp uses something called S-expressions for its syntax. An
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Expression_(computer_science)&quot;&gt;expression&lt;/a&gt;
is an entity that may be evaluated to determine its value. In Lisp, everything
is an expression. Let’s take a look at some Lisp Expressions that are also valid
JavaScript expressions.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;semicolon&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;how&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;you&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;introduce&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;lisp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// in JavaScript)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;means&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These are called primitive values. Primitive values and expressions aren’t the
only concepts shared with JavaScript though, Lisp also has function calls!
However, the syntax for them is different. They are wrapped in parentheses which
makes the order of evaluation unmistakable. Arguments are separated by a space
instead of a comma.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˅&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;These&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;separated&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;by&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;space&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s a little weird to see &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; before &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &amp;amp; &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, instead of in-between it.
That’s called &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Polish_notation&quot;&gt;prefix notation&lt;/a&gt;.
It’s also a bit odd to see an operator like &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; referred to as a function. Here
are a bunch of JavaScript next to Lisp examples to make this more concrete.&lt;/p&gt;
&lt;h4 id=&quot;operators&quot;&gt;&lt;a href=&quot;#operators&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Operators&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Operators are built-in with
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Infix_notation#:~:text=Infix%20notation%20is%20the%20notation,plus%20sign%20in%202%20%2B%202.&quot;&gt;infix notation&lt;/a&gt;
and you only need to provide parenthesis to opt-out of the built-in
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence&quot;&gt;order of operations&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// 12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// 18&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Lisp&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Operators are just function calls. Parenthesis are always provided which means
special syntax is not required to override built-in operator precedence, the
developer always has to provide it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;18&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;methods&quot;&gt;&lt;a href=&quot;#methods&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Methods&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In JavaScript, some operations are provided as functions on the object’s
prototype. The value on the left becomes &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; in the implementation of
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toUpperCase&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Don’t be deceived by the special method syntax, they’re also
functions you can reference directly.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// &amp;#39;HELLO&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// &amp;#39;H,I&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// An Array? Yes. How? Coercion. Why? Life is pain.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Lisp&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Same situation in Lisp as we had for operators, function on the left, arguments
on the right.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;upcase&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;HELLO&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;function-calls&quot;&gt;&lt;a href=&quot;#function-calls&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Function Calls&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Function calls have the name of the function on the left, some parentheses to
indicate calling that function, and arguments are provided in the parenthesis.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Lisp&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Same situation as operators and methods. Function on the left, arguments on the
right.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;integer&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice how in JavaScript, special syntax is used for operators, method calls &amp;amp;
function calls? In Lisp, they all use the same syntax! Suddenly it checks out
why the brainiacs use it.&lt;/p&gt;
&lt;h3 id=&quot;lisp-evaluation&quot;&gt;&lt;a href=&quot;#lisp-evaluation&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Lisp Evaluation&lt;/h3&gt;
&lt;p&gt;Lisp evaluates a program with a strategy called
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Evaluation_strategy#:~:text=Applicative%20order%20evaluation%20is%20an,before%20the%20function%20is%20applied.&quot;&gt;Applicative order&lt;/a&gt;.
Applicative order means that innermost arguments are evaluated &lt;em&gt;before&lt;/em&gt; they are
provided to their function in Lisp.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All the Lisp examples we’ve seen thus far have been evaluated this way!&lt;/p&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;You’ll notice Applicative order seems a great deal like what you’re used to in
JavaScript! JavaScript uses a similar strategy called
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing&quot;&gt;Call by sharing&lt;/a&gt;
which is very similar to Applicative order but differs in some important ways.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;special-forms&quot;&gt;&lt;a href=&quot;#special-forms&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Special Forms&lt;/h3&gt;
&lt;p&gt;Unfortunately, there are some exceptions to this simple evaluation strategy.
Since arguments are evaluated before they are provided to their function in
Lisp, certain types of constructs can’t be evaluated this way. Let’s explore a
hypothetical broken &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; function in Lisp to clarify this.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lisp&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Given&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Applicative&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Order&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluated&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;before&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;applying&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˅&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˅&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˅&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Cripes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;We&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;executed&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;branch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                            &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;even&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;though&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;we&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;shouldn&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;t have!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;; Value: 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since the arguments were evaluated before they were provided to the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
function we end up evaluating the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; branch even if we shouldn’t. Here is a
JavaScript interface to this problem:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;JavaScript&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// By the time ifElse gets the arguments, it&amp;#39;s too&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// late. As they say, &amp;quot;Young Herc was mortal now.&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ifElse&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To solve this problem Lisp keeps the same syntax but treats the evaluation for
those entities differently. This handful of specially interpreted expressions
are called
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://courses.cs.northwestern.edu/325/readings/special-forms.php#:~:text=What%20are%20special%20forms%3F,%2C%20if%20any%2C%20are%20evaluated.&quot;&gt;special forms&lt;/a&gt;.
Special forms look like normal function calls, however, the interpreter treats
them, specially.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lisp&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Lisp&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;understands&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;different&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluates&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;conditional&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;first&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;determine&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;what&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;           &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;           &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;           &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;will&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;be&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluated&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;but&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;           &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;will&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;never&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;be&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluated&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See how Lisp knows that &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is different? Special even? Worthy of a noble
treatment indeed!&lt;/p&gt;
&lt;p&gt;Alright, that’s everything we need to know to start our JSON Lisp journey.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;lisp-in-json&quot;&gt;&lt;a href=&quot;#lisp-in-json&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Lisp in JSON&lt;/h2&gt;
&lt;p&gt;Let’s migrate our Lisp examples into a JSON syntax.&lt;/p&gt;
&lt;p&gt;Our basic primitive values, like &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; and &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; hold-up just fine as
values in JSON. So we don’t need to do anything there. Things start to get
interesting when we look at expressing function calls in JSON. Which, if you
remember from our Lisp crash course above, buys us operators and methods too.&lt;/p&gt;
&lt;h3 id=&quot;function-calls&quot;&gt;&lt;a href=&quot;#function-calls&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Function Calls&lt;/h3&gt;
&lt;p&gt;To represent function calls in JSON let’s take a look at our addition example.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lisp&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lisp&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unfortunately for us the elegant parenthesis, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, are invalid symbols in JSON.
Fortunately, their rectilinear cousins &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; are totally valid. So let’s swap
those. While we’re at it whitespace is insignificant and will be thrown out by
most JSON deserializers/parsers, so we’ll use the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; as our separator. These
two modifications alone, give us a mechanism for expressing the above program in
JSON.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;JSON Lisp&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s look at our other examples in light of these rules.&lt;/p&gt;
&lt;h3 id=&quot;example-json-lisp-programs&quot;&gt;&lt;a href=&quot;#example-json-lisp-programs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Example JSON Lisp Programs&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;JSON Lisp Operators&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;JSON Lisp Methods&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;uppercase&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;hello&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;JSON Lisp Function Calls&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;uppercase&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Life is dope.&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;JSON Lisp Special Forms&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//         ˄             ˄           ˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//         |             |           |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//         |             |           |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//     condition      if true     otherwise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Turns out that Lisp’s simple S-expression syntax make it pretty easy to model&lt;br/&gt;
in JSON.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;json-lisp-implementation&quot;&gt;&lt;a href=&quot;#json-lisp-implementation&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;JSON Lisp Implementation&lt;/h2&gt;
&lt;p&gt;Our JSON Lisp implementation will be done in TypeScript.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TypeScript, so hot right now. - Mugatu&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;lexical-analysis-and-parsing&quot;&gt;&lt;a href=&quot;#lexical-analysis-and-parsing&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Lexical Analysis &amp;amp; Parsing&lt;/h3&gt;
&lt;p&gt;First things first, programming language implementations typically need a
mechanism for taking the source program, a string of text, and turning it into a
structure that the interpreter or compiler can work with, this is called a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Parse_tree#:~:text=A%20parse%20tree%20or%20parsing,to%20some%20context%2Dfree%20grammar.&quot;&gt;parse tree&lt;/a&gt;
The parse tree is often subsequently converted into an
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Abstract_syntax_tree&quot;&gt;abstract syntax tree&lt;/a&gt; for
further analysis, however, our implementation will interpret the parse tree
directly. So what do we need for the lexer and parser? Get ready.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yup, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;parse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Takes care of our lexing and parsing. It converts values
nicely and even gives useful syntax errors. Out of the gate, our JSON Lisp will
have a great headstart for other host language implementations!&lt;/p&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;The growth of modern streaming architectures &amp;amp; streaming JSON parsers raises
an interesting possibility I’d love to explore further (or hear about if you
explore it) around streaming evaluation, or the ability to evaluate the
program as it is downloaded and parsed. This would make JSON Lisp or something
like it a really interesting general-purpose format for primarily server
rendered architectures with persistent views that emit instructions to the
client using Web Sockets like
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/phoenixframework/phoenix_live_view&quot;&gt;Phoenix Live View&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ok, since we have a type system at our disposal we may as well add some nice
type annotations for JSON.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;boolean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;number&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;string&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;evaluation&quot;&gt;&lt;a href=&quot;#evaluation&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Evaluation&lt;/h3&gt;
&lt;p&gt;To evaluate a JSON Lisp expression we’ll provide a function called &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.
Which will take in a JSON Lisp &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, the return value of parse above,
and an &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. The &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is the context the program will be run
in. The &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; will contain the implementations of our built-in operators
and provide us a place for storing user-land function definitions and values.&lt;/p&gt;
&lt;p&gt;You can think of the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; as the global namespace in a browser window.
There are some built-in functions you can call that are implemented in the host
language like &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;alert&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. It also contains functions that you put there.&lt;/p&gt;
&lt;p&gt;So our &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Environment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; type will be a map of identifiers (global names) to either
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;JSON&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; (user-land implementations) or to JavaScript &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;s (host language
provided functions).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// The environment is a map of identifiers to values.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//                 ˄       ˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//                 |       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//                 |       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//                user    host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// TODO Write the evaluator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;applicative-order-evaluation&quot;&gt;&lt;a href=&quot;#applicative-order-evaluation&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Applicative Order Evaluation&lt;/h4&gt;
&lt;p&gt;In Applicative Order evaluation, each expression is evaluated before providing
it to its function. For our base case, we’ll evaluate each of the arguments
along with the function recursively as we walk down the expression tree, and
we’ll apply our evaluated procedures on the way up (in Lisp the function is
often called the procedure).&lt;/p&gt;
&lt;p&gt;When we encounter a string, we’ll look up its
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Subroutine&quot;&gt;function&lt;/a&gt; implementation in the
environment often called a procedure in Lisp, or by the OG programmers of 20+
years ago.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// When we encounter an expression, `[ ]`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Evaluate each of the sub-expressions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// If there is nothing to apply, we have a value.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Retrieve the procedure from the environment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Apply it with the evaluated arguments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Look up strings in the environment as references.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Return values.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is enough to implement our &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; examples! In fact, with this small
implementation we can implement the 1.1 exercises from MIT’s famous
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://mitpress.mit.edu/sites/default/files/sicp/index.html&quot;&gt;Structure &amp;amp; Interpretation of Computer Programs&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;subtract&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;division&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;multiplication&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// We provide the environment that references read from here.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;subtract&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;division&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;multiplication&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultEnvironment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;other-functions&quot;&gt;&lt;a href=&quot;#other-functions&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Other Functions&lt;/h4&gt;
&lt;p&gt;With that, the pattern for adding &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;functions&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to call is to provide their
implementations on the environment and then reference them by name in the left
most position in our JSON Lisp S-Expression.&lt;/p&gt;
&lt;p&gt;For example, we could add uppercase to our environment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;uppercase&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;uppercase&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;Using strings to double as identifiers creates a weird class of bugs, what if
I mean the string &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;uppercase&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; instead of the function &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;uppercase&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;? To solve
this a special form could be introduced for reading identifiers or expressing
strings. E.G. &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;special-forms&quot;&gt;&lt;a href=&quot;#special-forms&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Special Forms&lt;/h4&gt;
&lt;p&gt;As we explored above, certain constructs can’t be implemented as functions using
strict applicative order evaluation, for example, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Let’s explore adding a
special form for handing &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//       ˄         ˄           ˄&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//       |         |           |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//       |         |          Else branch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//       |         Run this only if the predicate is true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//       Evaluate the predicate first&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// returns 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The way we’ll go about this is checking to see if the expression reflects one of
our special forms before we evaluate. If it does we’ll evaluate it specially, if
it doesn’t we’ll evaluate and apply as usual!&lt;/p&gt;
&lt;p&gt;In the case of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, we’ll first evaluate its predicate. Depending on the value
returned we’ll then subsequently evaluate the correct branch.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Look for special forms based on the first array entry.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;switch&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Check if we have a special form!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;case&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Retrieve the predicate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;predicate&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Evaluate the predicate in the environemnt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;predicate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// If it is true evaluate the first branch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// If it is false evaluate the false branch,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// if one is provided.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Time for some applicative order evaluation Ma!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Nothing changed here.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sweet! Now we’ve got support for conditional branching in our JSON Lisp!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// If an else branch isn&amp;#39;t provided return a null value.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;evaluate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With, that the pattern for adding special forms is to add additional branches to
the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;switch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; statement.&lt;/p&gt;
&lt;h3 id=&quot;summary&quot;&gt;&lt;a href=&quot;#summary&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Summary&lt;/h3&gt;
&lt;p&gt;At this point, our JSON Lisp implementation is in a place where we can add more
special forms and provide new function implementations. I hope that this toy
implementation illuminated some dark corners about how programming languages
work. At the least, I hope you had fun!&lt;/p&gt;
&lt;p&gt;You can play with &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/iammerrick/json-lisp&quot;&gt;JSON Lisp here&lt;/a&gt; by
cloning the repository and running &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Some suggestions for taking this a step further:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Implement &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;define&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; for creating new abstractions on the environment,
variables, and functions! Can prototypical inheritance be used to mimic a
stack for function variable scoping?&lt;/li&gt;
&lt;li&gt;Implement additional special forms!&lt;/li&gt;
&lt;li&gt;Someone please explore streaming evaluation and tell me how it goes!&lt;/li&gt;
&lt;/ol&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Lazy Evaluation in JavaScript</title><link>https://www.merrickchristensen.com/articles/lazy-evaluation-in-javascript</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/lazy-evaluation-in-javascript</guid><description>JavaScript&apos;s call by sharing and getter semantics allow us to implement lazy evaluation for field access.</description><pubDate>Sat, 25 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;S&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;ometimes evaluating an&lt;/span&gt; argument for a function is expensive! So expensive, that
you only want to pay that fiddler to evaluate the value when the function you
are calling &lt;em&gt;uses&lt;/em&gt; the value.&lt;/p&gt;
&lt;p&gt;Let’s look at this problem abstractly first:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// The problem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Arguments are sometimes only conditionally used!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isExpensiveUseful&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;doSomethingWithExpensiveArg&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensiveIsntEvenUsed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getExpensiveValue&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/*..*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Dangit! I had to compute expensive even though the `code`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// may not use it!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do you see the problem? &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, requires &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; but it only uses
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; if &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isExpensiveUseful&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is truthy! This isn’t ideal because we have
to compute &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; every time, even if &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; doesn’t use it.&lt;/p&gt;
&lt;h3 id=&quot;the-obligatorily-mentioned-boring-thunk&quot;&gt;&lt;a href=&quot;#the-obligatorily-mentioned-boring-thunk&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Obligatorily Mentioned Boring Thunk&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Jump to the section on Self Overwriting Lazy Getters to skip the obligatorily
mentioned boring option.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If we have access to the function that only conditionally uses the expensive
argument and we have access to update its other callers we can simply change the
interface to make &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; a function that returns the &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; value.
This allows the consumer of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to determine if we should pay the cost
of computing it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Solution One - The Thunk, Explicit Deferred Evaluation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isExpensiveUseful&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// We only pay the cost of `getExpensive`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// (and therefore whatever functions it calls)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// if we actually use it! Nice!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;doSomethingWithExpensiveArg&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getExpensive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensiveIsntEvenUsed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;payTheCostLaterIfYouWantThunk&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getExpensiveValue&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/*..*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// It&amp;#39;s all on you now code, do us right.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getExpensive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;payTheCostLaterIfYouWantThunk&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This updates the function’s interface to make the conditional use of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
explicit and allows &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to decide when to evaluate it. This is a great option
if you have access to update the code and all the callers. It also requires you
to have confidence that they are using that expensive value only when it is
needed. Unfortunately, their function may be consuming functions that
conditionally want the expensive value and you’d need to be able to update every
value user to where the value is needed to make sure this strategy works.&lt;/p&gt;
&lt;h3 id=&quot;self-overwriting-lazy-getters&quot;&gt;&lt;a href=&quot;#self-overwriting-lazy-getters&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Self Overwriting Lazy Getters&lt;/h3&gt;
&lt;p&gt;An obscure and far less boring technique is to provide a getter that overwrites
itself on the first retrieval. This allows us to avoid paying the cost of
evaluating &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; if it isn’t used without updating the function that
conditionally uses it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isExpensiveUseful&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Hey it&amp;#39;s being access so it is time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// to pay the fiddler!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;doSomethingWithExpensiveArg&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensiveIsntEvenUsed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/*..*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// This code will only be run when someone&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// accesses `expensive`.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Don&amp;#39;t forget to overwrite the value so you&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// only pay the cost once!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// `this` is the object that contains `cheap` and&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// our `expensive` getter upon first retrieval we&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// overwrite the getter with its value.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getExpensiveValue&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First, we make &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expensive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; an “implicit thunk” by providing a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get&quot;&gt;getter&lt;/a&gt;.
The getter is only run when someone accesses that field. Here comes the
important part. The getter than overwrites itself with the computed value!
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; in the getter refers to the object that contains the getter. We are
overwriting the getter from within the getter with the computed value. This
prevents &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getExpensiveValue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; from being run several times if the value is
accessed several times.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;concrete-example&quot;&gt;&lt;a href=&quot;#concrete-example&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Concrete Example&lt;/h2&gt;
&lt;p&gt;Consider the following API that accepts any DOM element and returns a tree of
the same shape with each element’s computed &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &amp;amp; boundling client &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rect&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
if that particular element has any classes attached.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;classList&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getComputedStyle&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let’s explore some sample usage.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Here is what usage looks like!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Should return the styles of the first element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// with classes in the document.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Should return the styles of the second element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// in the first child with classes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Should return the layout of the first element&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If we wrap it in a time function we can get a rough pulse on how expensive it is
and running it in the console.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Time Before Computation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;performance&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Subtract time before against time now.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;This computation took: &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;performance&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;ms&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My results running this function on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com&quot;&gt;github.com&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;984999999782303&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;9449999985663453&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;269999999451102&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;make-it-lazy-make-it-fast&quot;&gt;&lt;a href=&quot;#make-it-lazy-make-it-fast&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Make It Lazy, Make It Fast&lt;/h3&gt;
&lt;p&gt;Let’s explore how we can use our new “Lazy Getter” technique to only compute
what is used.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// We don&amp;#39;t even walk the whole DOM in one go! Just one layer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// of depth at a time, as needed!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Only compute styles on demand if they&amp;#39;re retrieved&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;classList&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getComputedStyle&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Only compute rect on demand if it is retrieved&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;delete&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When we first call our lazy implementation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Very little work is done! We just create an object with some locked and loaded
properties that are ready to do the real work if and when needed. Additionally,
we only do the work one layer at a time, so when &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is accessed, that
just returns a list of locked and loaded objects.&lt;/p&gt;
&lt;p&gt;The actual heavy lifting of walking the DOM, computing styles, and measuring
layout are all done lazily as needed.&lt;/p&gt;
&lt;p&gt;Here are my results running the lazy version on &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com&quot;&gt;github&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;43000000005122274&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1250000004802132&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;28000000020256266&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As we expected, the lazy version is many times faster. And less memory
intensive! That is because we avoid computing or storing anything that isn’t
used, while the initial implementation computes the entire tree upfront even
though only a handful of paths are accessed. Yikes!&lt;/p&gt;
&lt;h3 id=&quot;memoized-getters&quot;&gt;&lt;a href=&quot;#memoized-getters&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Memoized Getters&lt;/h3&gt;
&lt;p&gt;An alternative implementation of self overwriting lazy getters is to define a
memoized property that caches its result after its first call.&lt;/p&gt;
&lt;p&gt;Lodash provices a handy utility called
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://lodash.com/docs/4.17.15#once&quot;&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which runs a function once and
caches the value. Subsequent calls return the value initially computed.&lt;/p&gt;
&lt;p&gt;Here is an implementation of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// If we don&amp;#39;t have it cached, compute and cache it.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Otherwise, return the cache.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we can
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty&quot;&gt;define a property&lt;/a&gt;
on our object that calls our memoized getter.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cheap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;expensive&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getExpensiveValue&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is what our &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; implementation looks like with &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; at our
disposal.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getVisualDetails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;child&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;classList&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getComputedStyle&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important thing here, is that regardless of implementation, we want to
compute the expensive value &lt;em&gt;once&lt;/em&gt; and lazily &lt;em&gt;as needed&lt;/em&gt;. If you’re wondering
how our memoized version performs, its pretty comparable to our self-overwriting
implementation.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5100000003039895&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;14000000010128133&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;This&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;computation&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;took&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;15499999972234946&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;summary&quot;&gt;&lt;a href=&quot;#summary&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Summary&lt;/h3&gt;
&lt;p&gt;JavaScript is a wonderfully (and sometimes terribly) flexible language. Its
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing&quot;&gt;call by sharing&lt;/a&gt;
and
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get&quot;&gt;getter&lt;/a&gt;
semantics allow us to implement lazy evaluation for field access.&lt;/p&gt;
&lt;p&gt;An exercise left for the reader is to implement lazy evaluation using
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy&quot;&gt;ES2015 Proxy&lt;/a&gt;s.&lt;/p&gt;
&lt;p&gt;This technique of
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Lazy_evaluation&quot;&gt;lazy evaluation&lt;/a&gt; is sometimes
referred to as
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_need&quot;&gt;call by need&lt;/a&gt;.
To explore this concept further I’d recommend an exploration of Haskell where
the entire language is lazily evaluated.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>No Code is Eating Software</title><link>https://www.merrickchristensen.com/articles/no-code-is-eating-software</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/no-code-is-eating-software</guid><description>Marc Andreessen was right, software is eating the world! Today more people can create software than ever and this trend will only continue as No Code eats software.</description><pubDate>Fri, 26 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;I&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;n 2011, Marc&lt;/span&gt; Andreessen famously wrote that
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://a16z.com/2011/08/20/why-software-is-eating-the-world/&quot;&gt;software is eating the world&lt;/a&gt;.
His article has proven prescient and this trend shows no signs of slowing.
Unfortunately, the power to take part in the digital economy was limited to the
tiny percentage of people who could create software by hand with code. The No
Code movement is about building bridges to creators and empowering them to
create software without code. Already we see rich visual development tools for
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://webflow.com&quot;&gt;creating websites &amp;amp; user interfaces&lt;/a&gt;,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://zapier.com&quot;&gt;connecting systems&lt;/a&gt; &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://airtable.com&quot;&gt;managing data&lt;/a&gt;. There is going to be an explosion of
specialized tools to distribute tasks that are currently confined to the work of
engineers. The component mental model will be distributed across product
organizations as the source of truth for Design Systems are moved from front-end
developers to designers using tools like &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.modulz.app/&quot;&gt;Modulz&lt;/a&gt; &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.plasmic.app/&quot;&gt;Plasmic&lt;/a&gt;. We’re going to see the data world shaken up
with tools for &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://luna-lang.org&quot;&gt;data processing&lt;/a&gt; &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://teachablemachine.withgoogle.com/&quot;&gt;AI model training&lt;/a&gt;. The cost of
creating in-house tools is going to drop with the expanding breadth of
functionality landing in
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://aws.amazon.com/blogs/aws/introducing-amazon-honeycode-build-web-mobile-apps-without-writing-code/&quot;&gt;cloud providers&lt;/a&gt;
&amp;amp; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://retool.com&quot;&gt;new visual tools&lt;/a&gt;. It’s only a matter of time before
accessible general purpose visual development unleashes the masses. Yes, Marc
Andreessen was right, software is eating the world! Today more people can create
software than ever and this trend will only continue as No Code eats software.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally authored &amp;amp; published for a &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://ui.dev/&quot;&gt;UI.dev&lt;/a&gt; newsletter.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Lessons from Lean Manufacturing</title><link>https://www.merrickchristensen.com/articles/lessons-from-lean-manufacturing</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/lessons-from-lean-manufacturing</guid><description>Continuous improvement is better than delayed perfection.</description><pubDate>Sat, 25 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/0988262592&quot;&gt;The Phoenix Project&lt;/a&gt;
is a narrative about an organization struggling to evolve to compete in the
digital economy. It was written for a general, business-oriented audience to
help a few vital concepts sink in at all layers of an organization.&lt;/p&gt;
&lt;p&gt;The book uses the lens of a factory to transfer the lessons of the industrial
revolution &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Lean_manufacturing&quot;&gt;lean manufacturing&lt;/a&gt; to the
digital era.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;the-three-ways&quot;&gt;&lt;a href=&quot;#the-three-ways&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Three Ways&lt;/h3&gt;
&lt;h4 id=&quot;flow-efficiency-over-resource-efficiency&quot;&gt;&lt;a href=&quot;#flow-efficiency-over-resource-efficiency&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Flow Efficiency Over Resource Efficiency&lt;/h4&gt;
&lt;p&gt;Thinking of your business as a manufacturing line where value flows from
business needs to the customer can help you reduce bottlenecks and misaligned
prioritization between organizations.&lt;/p&gt;
&lt;p&gt;Flow efficiency is optimizing for an end to end value delivery. How fast are you
able to get work from ideation to end-user value? While resource efficiency is
thinking in terms of how utilized your current resources are. It seems the human
default is to think in terms of resource efficiency. “If I’m busy &amp;amp; working my
hardest and so is everyone else… we must be doing all that we can to reach our
desired result!”&lt;/p&gt;
&lt;p&gt;The insight of optimizing for flow efficiency is that it teaches you to think in
terms of the entire system.&lt;/p&gt;
&lt;p&gt;Interestingly, this concept is not foreign to engineers. We all know that your
app is only as fast as your slowest bottleneck. Sure, your code may be efficient
but as long as your connecting to that old legacy database and running that
expensive query every request, your ship is sunk. And you’re not going to make
it faster by ensuring your CPU &amp;amp; memory usage are always peaked (resource
efficiency). In fact, throwing more machines might ultimately cause more
coordination overhead and flood the constrained resource making matters worse.&lt;/p&gt;
&lt;p&gt;In the world of software &amp;amp; machines, this concept is intuitive. If you zoom out
a little… to the software makers. You’ll find this lens is useful in
optimizing how you make the software itself. Optimize for flow efficiency, end
to end value delivery.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove constraints in your system&lt;/li&gt;
&lt;li&gt;Reduce work in progress (it creates coordination &amp;amp; context switching overhead)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;Another lens is thinking of your business as a flywheel, if any part of the
flywheel isn’t forwarding the momentum the whole thing comes to a screeching
halt! This metaphor is useful over the assembly line because it shows that
outputs of the business feedback in as inputs to the business. Farnam Street
had a wonderful podcast with
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fs.blog/jim-collins/&quot;&gt;Jim Collins, Keeping the Flywheel in Motion&lt;/a&gt; on
this subject.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;shorten-feedback-loops&quot;&gt;&lt;a href=&quot;#shorten-feedback-loops&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Shorten Feedback Loops&lt;/h4&gt;
&lt;p&gt;Flow efficiency teaches us to optimize for delivering value from the business to
the user. The second insight is to shorten feedback loops from the user to
business. This sort of thinking was popularized by the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Lean_startup&quot;&gt;Lean Startup methodology&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mechanisms for shortening feedback loops are sometimes battle-tested best
practices. At other times they look more like creative &amp;amp; novel experiments. If
we think of our system fractally, zooming in to our constraints &amp;amp; subsystems we
can employ different strategies based on the culprit.&lt;/p&gt;
&lt;p&gt;For example, we can drastically shorten feedback loops about our business idea
by deferring the expensive cost of building an entire project and first
conducting market research. Perhaps offering preorders or a marketing site that
gathers emails.&lt;/p&gt;
&lt;p&gt;We can shorten the feedback loop of specific user experience decisions by first
creating high fidelity prototypes and testing them before paying expensive
development costs.&lt;/p&gt;
&lt;p&gt;Within the product development subsystem itself, we do all sorts of things to
shorten feedback loops. Here are some of my favorites, listed in order of
optimizing feedback loops from the individual developer experience out to the
broader team.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://prettier.io/&quot;&gt;Editor integrated automated code formatting&lt;/a&gt; that
reveals syntax errors I would have otherwise waited for the linter or compiler
to reveal.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://eslint.org/&quot;&gt;Linter&lt;/a&gt; to reveal syntax and other statically analyzable
errors I would have otherwise waited till runtime to discover.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://flow.org/&quot;&gt;Type System&lt;/a&gt; or a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.typescriptlang.org/&quot;&gt;Typed Language&lt;/a&gt; to reveal statically
analyzable semantic errors I would have otherwise waited till runtime or
integration time to discover.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://jestjs.io/&quot;&gt;Write tests&lt;/a&gt; that give you immediate feedback as you
author your code you otherwise would need to exercise by hand.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.cypress.io/&quot;&gt;Write end to end tests&lt;/a&gt; that exercise the end user’s
experience that you otherwise would need to wait for a quality assurance team
member, or worse, your end-user to discover.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;Continuous Integration&lt;/a&gt;
shortens the feedback loop I would otherwise need to wait to manually deploy,
integrate with the latest code, update dependency versions, etc.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.bugsnag.com/&quot;&gt;Production Monitoring&lt;/a&gt; means I get insight into my
code failing without waiting for users to contact support, and for support to
find their way to me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The book advocates use of a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Kanban_board&quot;&gt;Kanban board&lt;/a&gt; for identifying back
pressure &amp;amp; discovering constraints in your system. If many tasks spend a lot of
time in a specific column, you’ve got a constraint to address. Generally, I’ve
found Kanban boards to be very effective if everybody on the team is invested in
its data integrity &amp;amp; onboard with using it as a tool for improving the flow of
work.&lt;/p&gt;
&lt;p&gt;In many ways, there is a meta “feedback loop” for improving the improvement of
the system. Individual team members know how to shorten loops at their
workstation better than the team does. Individuals know how to shorten feedback
loops between each other better than the team. The team knows how to improve
their interactions &amp;amp; process better than the department. The department leaders,
better than the CEO. Ad Infinitum. In the same way that we ought to shorten
feedback loops from the end-user to business, perhaps we would benefit to
shorten meta feedback loops about the system itself from individual contributors
back to the business.&lt;/p&gt;
&lt;h4 id=&quot;learning-culture&quot;&gt;&lt;a href=&quot;#learning-culture&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Learning Culture&lt;/h4&gt;
&lt;p&gt;The last advocation in the book is to create a culture where constant
experimentation &amp;amp; feedback is encouraged. Intentionally put tension into the
system to reinforce good habits &amp;amp; improve something. Continuous, never-ending
improvement, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Kaizen&quot;&gt;kaizen&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Safe retrospectives&lt;/li&gt;
&lt;li&gt;Intentionally creating chaos to exercise crisis response processes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/articles/cost-of-consensus&quot;&gt;Distributing technical architecture to mitigate the risk of technical decisions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This third way is particularly poignant to me as a tempering force against the
first two ways. Often well-intentioned managers trying to improve flow
efficiency &amp;amp; shorten feedback loops institute measures to better understand
their system. Unfortunately, in the words of
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Goodhart%27s_law&quot;&gt;Goodhart&lt;/a&gt;,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Any statistical regularity will tend to collapse once pressure is placed upon
it for control purposes.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Or said far more idiomatically, by Marilyn Strathern,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“When a measure becomes a target, it ceases to be a good measure.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The culture will be an authoritarian culture of hiding mistakes, blame &amp;amp; fear if
people are externally measured &amp;amp; punished. Their measures will look great but
their results won’t. A learning culture is a safe culture.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Art of Abstraction</title><link>https://www.merrickchristensen.com/articles/abstraction</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/abstraction</guid><description>Monorepos &amp; packages seem to be all the rage. However, simply relocating code to a package doesn’t make it more valuable. In fact, it can make it more expensive &amp; introduce unexpected risks! The real value comes from good abstractions.</description><pubDate>Fri, 29 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;M&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;onorepos &amp;amp; packages&lt;/span&gt; seem to be all the rage. However, simply relocating code to
a package doesn’t make it more valuable. In fact, it can make it more expensive
&amp;amp; introduce unexpected risks! The real value comes from &lt;strong&gt;good&lt;/strong&gt; abstractions.
Packages are a set of tools to author, encapsulate &amp;amp; distribute such
abstractions. Here are some thoughts for you to consider when designing an
abstraction.&lt;/p&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;Fundamentally, computer science is a science of abstraction — creating the
right model for thinking about a problem and devising the appropriate
mechanizable techniques to solve it. -
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://infolab.stanford.edu/~ullman/focs/ch01.pdf&quot;&gt;Jeffry Ullman, Computer Science: The Mechanization of Abstraction&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When creating a package it is important to
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.facebook.com/notes/kent-beck/one-bite-at-a-time-partitioning-complexity/1716882961677894/&quot;&gt;consider the complexity we want the package to encapsulate&lt;/a&gt;.
One of my favorite mental tools for reasoning about abstraction is the
abstraction graph introduced by Cheng Lou in his talk
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://youtu.be/mVVNJKv9esE?t=304&quot;&gt;“The Spectrum of Abstraction”&lt;/a&gt;, here is the
TLDR;&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;a href=&quot;/assets/images/articles/abstraction/spectrum-of-abstraction.png&quot;&gt;&lt;img src=&quot;/assets/images/articles/abstraction/spectrum-of-abstraction.png&quot; alt=&quot;A React Motion Abstraction Graph&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;A React Motion Abstraction Graph&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A few definitions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Usefulness – Concrete use case for an abstraction.&lt;/li&gt;
&lt;li&gt;Power – How many downstream use cases an abstraction powers.&lt;/li&gt;
&lt;li&gt;Indirection Cost – Cognitive load is increased if an abstraction fails to
encapsulate its complexity. For example, if &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;react&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;motion&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; required us to “go
up” the chain and implement something with React directly in order to be
“useful”. Then we paid the cognitive (and code size) cost of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;react&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;motion&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &amp;amp;
the cost of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;react&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; in order to fulfill our use case.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The value of an abstraction should exceed the cost of indirection. This value
comes in the form of abstracting complexity and/or isolating risk.&lt;/p&gt;
&lt;p&gt;The interface for an abstraction should strive for the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://2014.jsconf.eu/speakers/sebastian-markbage-minimal-api-surface-area-learning-patterns-instead-of-frameworks.html&quot;&gt;minimum API surface&lt;/a&gt;
intrinsically required to make it useful.&lt;/p&gt;
&lt;p&gt;An abstraction should not
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/&quot;&gt;“leak”&lt;/a&gt;
the complexity of whatever it is responsible for encapsulating. Else we are
doomed to incur the overhead of the abstraction and inherit the cost of the
thing we were trying to abstract in the first place.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Abstraction is a tool for collective thought&lt;/em&gt;. It results in more cohesive APIs
&amp;amp; tooling across projects because people are thinking &amp;amp; collaborating about
things with a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.cs.virginia.edu/~evans/cs655/readings/steele.pdf&quot;&gt;similar language&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Abstraction is a double edged sword. The right abstraction can be immensely
valuable. The wrong abstraction can be extremely expensive. One is unlikely to
create a useful abstraction over something they don’t understand and given the
high impact potential of abstraction we should be prudent in our wielding of
this power. A great deal of the risk in an abstraction comes from its conceptual
overhead. Jeffry Ullman&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Don’t repeat yourself is the introductory step to the real principle; don’t
repeat concepts.” — Jimmy Koppel&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’d recommend
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.youtube.com/watch?v=f84n5oFoZBc&quot;&gt;Hammock Driven Development&lt;/a&gt; as
part of your exercise in identifying abstractions.&lt;/p&gt;
&lt;p&gt;As a concrete example of a wonderful abstraction that abides by the above
principles I offer React. React abstracts the complexity of keeping the DOM up
to date efficiently &amp;amp; securely. React’s value also shines in its
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://2014.jsconf.eu/speakers/sebastian-markbage-minimal-api-surface-area-learning-patterns-instead-of-frameworks.html&quot;&gt;drastic reduction of API surface area&lt;/a&gt;
compared to working with the DOM directly, you no longer have to think about the
intricacies of the browser! Because you’ve taken on the constraints of working
with the abstraction new opportunities are afforded, such as rendering to a
different platform. React additionally gives us new concrete language like
“Component” &amp;amp; “Element” to collaborate, as well as the ability to define our own
language in terms of this collective language. React is truly a delightful
abstraction for this and many other reasons.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Cost of Consensus</title><link>https://www.merrickchristensen.com/articles/cost-of-consensus</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/cost-of-consensus</guid><description>Alignment is Precious. The cost of alignment increases proportional to the number of agents that need to be aligned.</description><pubDate>Sat, 24 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;tldr&quot;&gt;&lt;a href=&quot;#tldr&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;TL;DR&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;Y&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;ou have two&lt;/span&gt; knobs at your disposal when managing the cost of alignment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How effective your team is at getting aligned.&lt;/li&gt;
&lt;li&gt;The number of people you are required to align.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Though it is an uncomfortable reality, I don’t think any team’s alignment
effectiveness is able to overcome the sheer volume of connections as a team
scales. Consequently, I’d like to encourage more thinking &amp;amp; discussion about how
to reduce the number of people required to be aligned in the first place.&lt;/p&gt;
&lt;p&gt;When you need to make a decision, limit its scope, prove it out in a safe way.
Don’t pay the cost of consensus eagerly until you have to. Weigh the value of
consensus against the probability of reaching it, when you do this a whole bunch
of things that make you itch for uniformity show their true colors as minutia
and you find tolerance is a viable strategy. Build consensus for the things that
truly matter and cherish alignment when you have it.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;the-cost-of-consensus&quot;&gt;&lt;a href=&quot;#the-cost-of-consensus&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Cost of Consensus&lt;/h2&gt;
&lt;p&gt;Authentic alignment is precious. When a group of people has agreed on a given
course of action their collaboration will result in a beautiful result that is
more than just the sum of the parts. Beyond that, each member of the team will
be engaged because they understand the who, why, what, where and when of each
item at hand to accomplish their shared purpose. Everyone has felt what it is
like to be on a team that is truly aligned &amp;amp; consequently it is no wonder
organizations everywhere pursue this kind of alignment.&lt;/p&gt;
&lt;h3 id=&quot;alignment-is-expensive&quot;&gt;&lt;a href=&quot;#alignment-is-expensive&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Alignment Is Expensive&lt;/h3&gt;
&lt;p&gt;The cost of alignment increases proportionally to the number of agents that need
to be aligned. On a small team, alignment is so cheap that it is taken for
granted. For example, if Bob is on a team with Susan. Susan &amp;amp; Bob have a
conversation about their next steps and they are effectively aligned as a side
effect of their planning.&lt;/p&gt;&lt;div class=&quot;dialogue&quot;&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Bob.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;Hey Susan, I’m thinking we should use React for your next project, what do you
think?&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Susan.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;Hey Bob, sounds great!&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Susan &amp;amp; Bob align, effectively for free. But throw in just one more person,
Scuba Steve.&lt;/p&gt;&lt;div class=&quot;dialogue&quot;&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Bob.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;Hey all! I’m thinking we should use React for this next project, what do you
think?&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Susan.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;I was talking to Steve and he wanted to use Vue.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Steve, waits a few days cause he is on his scuba trip &amp;amp; he is kind of nervous to
confront Bob about his desire to use Vue.&lt;/p&gt;&lt;div class=&quot;dialogue&quot;&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Scuba for Life, Steve.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;Yeah, I’d rather try out Vue, you ok with that?&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Bob.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;No, I’m not OK with that.&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;line&quot;&gt;&lt;span class=&quot;speaker&quot;&gt;Susan.&lt;/span&gt;&lt;span class=&quot;speech&quot;&gt;Sounds like we need to meet.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;This makes sense, each person needs to be aligned with every other person and
consequently the cost of alignment goes up roughly:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;connections&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;people&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;people&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cost&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;alignment&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;connections&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;alignment&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;effectiveness&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is the number of connections in a group multiplied by a score of how
effective that group is at achieving alignment.&lt;/p&gt;
&lt;p&gt;What exactly is the cost? The cost is a rough proxy for the amount of time spent
doing “meta work” managing the connections before doing the “work” itself. The
cost is the time spent creating presentations to convince everyone involved, the
energy spent addressing questions, adapting to feedback, compromising &amp;amp;
convincing until everyone is aligned. It is the time that you aren’t getting
user feedback because you’re debating in the realm of imagination. The “cost of
alignment” refers to the very real financial &amp;amp; opportunity cost that causes
great people to look elsewhere. It makes your business ripe for disruption. Do
you find yourself in a growing business and feeling like you get &lt;em&gt;less&lt;/em&gt; done
even though you have &lt;em&gt;more&lt;/em&gt; people? Or shocked at how rapid your side-projects
move along while your team is still trying to figure out which framework to use?
&lt;em&gt;That&lt;/em&gt; is the cost of alignment.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 10 people with an alignment effectiveness of 0.5. The cost curves upward as people are added, reaching 22.5 at 10 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-is-alignment-effectiveness&quot;&gt;&lt;a href=&quot;#what-is-alignment-effectiveness&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What Is Alignment Effectiveness&lt;/h3&gt;
&lt;p&gt;Alignment Effectiveness is simply how effective your team is at getting aligned.
Are people radically candid with each other? How clear is the goal of the team
in the first place? Are people safe &amp;amp; comfortable with healthy disagreement? How
willing are people to disagree and commit? Are the incentives of the
organization such that playing as a team is more rewarded than winning as a hero
all-star contributor?&lt;/p&gt;
&lt;p&gt;What about communication mechanisms? Are conversations had in the open so anyone
can follow up and see why a decision is made? Are meetings recorded and run
effectively in their own right?&lt;/p&gt;
&lt;p&gt;Certainly, improving your team’s ability to reach consensus is one angle of
driving down the cost of consensus.&lt;/p&gt;
&lt;div class=&quot;figure-pair&quot;&gt;&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 10 people with an alignment effectiveness of 0.9. The cost curves upward as people are added, reaching 4.5 at 10 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 10 people with an alignment effectiveness of 0.2. The cost curves upward as people are added, reaching 36 at 10 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;In the above examples, the team with Effective Alignment can scale to a
reasonable number of people and keep the Cost of Alignment at bay. However, the
team with poor alignment immediately struggles as more people are added! Who
knows, maybe their goals aren’t clear? Maybe, they need to invest more time in
nurturing their connections? Maybe they hired a diva who refuses to collaborate?
Regardless, I just wish I could hug each one of them because that is a miserable
place to be.&lt;/p&gt;
&lt;p&gt;Worse yet, as each team tries to scale the number of people creates an
insurmountable cost, with the Alignment Effectiveness of the former charts held
constant:&lt;/p&gt;
&lt;div class=&quot;figure-pair&quot;&gt;&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 40 people with an alignment effectiveness of 0.9. The cost curves upward as people are added, reaching 78 at 40 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 40 people with an alignment effectiveness of 0.2. The cost curves upward as people are added, reaching 624 at 40 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Oh no! Even the team with great alignment skills has to pay a high cost to keep
their team aligned as they scale. No matter how effective each individual is at
reaching alignment there is a growing cost in the limitations of human
communication &amp;amp; the number of people attempting to communicate.&lt;/p&gt;
&lt;p&gt;Eventually, the number of people passes our biological limitations (150 is the
commonly used value) to coordinate effectively as a cohesive group, and sub
groups are forced to emerge. The number at which this occurs is referred to as
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/Dunbar%27s_number&quot;&gt;Dunbar’s number&lt;/a&gt;, Dunbar
theorized:&lt;/p&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;“this limit is a direct function of relative neocortex size, and that this in
turn limits group size […] the limit imposed by neocortical processing
capacity is simply on the number of individuals with whom a stable
inter-personal relationship can be maintained”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, what is a growing company supposed to do? Just stop growing?! No, of-course
not. I shudder to think of the wonderful human accomplishments that never would
have occurred if each organization decided to stop growing at this point. I
think it is natural to reach for processes &amp;amp; tools to improve Alignment
Effectiveness. I consider Agile, Kanban, Scrum &amp;amp; other planning methodologies as
tools people use for trying to improve this very measure.&lt;/p&gt;
&lt;p&gt;Unfortunately, these tools can come at the cost of autonomy and mastery and
yield a shallow sense of alignment where many people disengage. Furthermore, the
overhead of conforming to the process is at risk of exceeding the cost of
alignment. Often the overhead is simply additional cost (process for process
sake) and doesn’t improvement alignment at all. I think encouraging teams to use
these tools should they fit and creating an “interface” for reporting to the
organization is a reasonable middleground.&lt;/p&gt;
&lt;p&gt;Some of my favorite tools for improving alignment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RFC Processes&lt;/li&gt;
&lt;li&gt;Communication Interfaces like Changelogs, Slack Channel Types &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.fictiv.com/blog/posts/using-the-on-track-off-track-framework-to-drive-results&quot;&gt;Status Updates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’d like to propose some additional ways of thinking about this problem beyond
improving a team’s Alignment Effectiveness.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;small-teams&quot;&gt;&lt;a href=&quot;#small-teams&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Small Teams&lt;/h2&gt;
&lt;p&gt;Given that we are &lt;em&gt;not&lt;/em&gt; going to be talking about improving the Alignment
Effectiveness variable, that leaves us with one additional variable to work
with: &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;people&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. What tools do we have at our disposal to keep the cost
of consensus down by reducing the number of people that need to be aligned?&lt;/p&gt;
&lt;p&gt;The answer here is obvious in ideal, but extremely difficult in practice. Have
small teams! Jeff Bezos famously referred to this as the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://blog.idonethis.com/two-pizza-team/&quot;&gt;“two pizza rule”&lt;/a&gt;,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bezos believes that no matter how large your company gets, individual teams
shouldn’t be larger than what two pizzas can feed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I read this, I knew I could never work at Amazon because I eat an entire
pizza by myself so I’d languish in a life of perpetual isolation.&lt;/p&gt;
&lt;div class=&quot;figure-pair&quot;&gt;&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 8 people with an alignment effectiveness of 0.9. The cost curves upward as people are added, reaching 2.8 at 8 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 8 people with an alignment effectiveness of 0.2. The cost curves upward as people are added, reaching 22.4 at 8 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;By limiting team size to 8 people, the cost of alignment is much more
manageable. This sounds great, but of-course restructuring your organization
into small teams doesn’t mean that those teams suddenly don’t need to have
connections between them! The technical architecture has to facilitate this kind
of strategy.&lt;/p&gt;
&lt;p&gt;There is an adage referred to as Conway’s law that states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;organizations which design systems … are constrained to produce designs
which are copies of the communication structures of these organizations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If this is true, if systems are merely a reflection of the communication
structures that create them, is the relationship bidirectional? Meaning, can a
system backpropagate &amp;amp; change the communication structures of the organization
that creates it? I think so! Let’s explore the tip of the iceberg of a few ideas
to get your gears turning on how to scale your organization with technology.&lt;/p&gt;
&lt;h3 id=&quot;event-sourcing&quot;&gt;&lt;a href=&quot;#event-sourcing&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Event Sourcing&lt;/h3&gt;
&lt;p&gt;An event-sourced architecture allows subsystems to communicate over a
sequential, replayable log of events. Subsystems communicate their &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;writes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; by
putting an event in the log. All systems derive and manage their internal state
based on their processing of the log. With an architecture like this, each team
controls its infrastructure, databases, caches, interfaces &amp;amp; deployments.&lt;/p&gt;
&lt;p&gt;Subsystems should not talk to each other for state, it should derive a view of
the state it needs for its app from the log, creating what is effectively a
“copy” of the state. While this costs you in terms of (eventual) consistency, it
buys you resilience and scalability.&lt;/p&gt;
&lt;p&gt;There is then a “coordinator” that stitches all of the sub-systems together in a
loosely coupled way, on the backend that looks like routing/load balancing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;my&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;fancy&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;com&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;service-owned-by-some-sub-app-team&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;my-fancy-app.com/another-sub-app =&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;service-owned-by-another-sub-app-team&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And on the front-end, there might be a lightweight coordinator like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Router&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/some-app&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;https://my-fancy-app.com/some-sub-app&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeApp&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeApp&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/another-app&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AnotherSubApp&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;https://my-fancy-app.com/another-sub-app&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AnotherApp&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeApp&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this hypothetical example, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeApp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &amp;amp; &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AnotherSubApp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; are responsible for
communicating writes via &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; and deriving state from &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eventLog&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, they are
also given an &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to render into, they would also need to return a function
that can be used to “tear them down”. Both apps, in this case, have a clearly
defined interface, how they are implemented is owned by &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;team&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &amp;amp;
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;another&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;team&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Those teams each interview customers, deploy updates &amp;amp;
make technical decisions all autonomously within their “domain”.&lt;/p&gt;
&lt;p&gt;The “coordinator” implements the “shell” of the UI, such as the navigation &amp;amp; to
avoid too much redundant work, sub-systems can publish embedded interfaces for
each other to use. The team that owns the “coordinator” can also provide a
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Design&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;System&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; for sub-teams to use, unfortunately though, these design systems
create a wide “link” for consensus cost.&lt;/p&gt;
&lt;p&gt;This is a completely didactic &amp;amp; hypothetical interface. What an &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;App&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; looks like
in your system needs to be clearly defined for your team. And of course, whether
an architecture like this is a good idea depends a lot on the busines domain you
are serving.&lt;/p&gt;
&lt;p&gt;Here are some great resources for learning more about a loosely coupled event
based architecture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.youtube.com/watch?v=Cym4TZwTCNU&quot;&gt;Rich Hickey: Deconstructing the Database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying&quot;&gt;The Log: What every software engineer should know about real-time data’s unifying abstraction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.confluent.io/blog/using-logs-to-build-a-solid-data-infrastructure-or-why-dual-writes-are-a-bad-idea/&quot;&gt;Using logs to build a solid data infrastructure (or: why dual writes are a bad idea)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215&quot;&gt;Domain Driven Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;benefits&quot;&gt;&lt;a href=&quot;#benefits&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Benefits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Teams are &lt;em&gt;very&lt;/em&gt; encapsulated &amp;amp; therefore &lt;em&gt;very&lt;/em&gt; autonomous.&lt;/li&gt;
&lt;li&gt;The system has some great resiliency because subsystems can keep operating
when other systems have an outage. Systems can self-heal by catching up with
the log. Since there are copies of the state stored across various systems
your data has some great redundancy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;trade-offs&quot;&gt;&lt;a href=&quot;#trade-offs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Trade-offs&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Teams are so encapsulated that there is a great deal of redundant work. I
think tools like &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://grpc.io/docs/reference/&quot;&gt;gRPC&lt;/a&gt; help drive down this
cost but again, the more you share, the more links you introduce back into the
system, the higher the cost of consensus rises.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A large investment in infrastructure is required, however, tools like
Kubernetes &amp;amp; Kafka are improving the landscape.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is a performance cost, I think this is most notable on clients. Where
they share a runtime environment. Duplicating state on the client is just
wasteful. Shipping multiple runtime frameworks ultimately make your user pay
for reducing the cost of consensus. This cost can be mitigated by aligning
your teams and user personas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Analytics are harder to get right &amp;amp; cross compare, you’ll likely need to
create an “interface” for teams on this front.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you create good boundaries to reduce the risk of allowing teams to
innovate autonomously you have implicitly put boundaries on the positive scope
of the impact they’ll be able to make.&lt;/p&gt;
&lt;p&gt;I don’t know of a way to mitigate negative risk exclusively without also
compressing your upper end. If Julie can only contribute to this sub app, she
can only impact that sub app, regardless of the direction of that impact.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have so many architectural ideas to explore here. Especially as technology
like HTTP2, Web Workers, WASM, Portals &amp;amp; SharedArrayBuffers become more widely
available.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A humble bow of admiration to the people at Pluralsight, it was there that I
encountered many of these ideas in practice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;better-tools&quot;&gt;&lt;a href=&quot;#better-tools&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Better Tools&lt;/h3&gt;
&lt;h4 id=&quot;technology-agnostic-design-systems&quot;&gt;&lt;a href=&quot;#technology-agnostic-design-systems&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Technology Agnostic Design Systems&lt;/h4&gt;
&lt;p&gt;I hope that tooling will allow design systems to be created in a
framework-agnostic way and then “compile” to whatever technology the sub-system
is using. This preserves the sub-system team’s autonomy in their technical
choices without the overhead of maintaining their own implementation of the
design system. It also reduces the design team’s friction in making changes
across such a distributed &amp;amp; encapsulated system. Heck, Designers should be able
to push new versions of presentational components directly to the package
registry and sub systems should be able to import &amp;amp; use the latest version in
the technology of their choice.&lt;/p&gt;
&lt;h4 id=&quot;better-client-build-tools&quot;&gt;&lt;a href=&quot;#better-client-build-tools&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Better Client Build Tools&lt;/h4&gt;
&lt;p&gt;I hope that WebAssembly continues to thrive. That
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://webassembly.org/docs/dynamic-linking/&quot;&gt;dynamic linking&lt;/a&gt; &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/WebAssembly/gc&quot;&gt;garbage collection integration&lt;/a&gt; make it a
viable compilation target for polyglot teams.&lt;/p&gt;
&lt;p&gt;I hope HTTP2 adoption continues and that our build tools can take advantage of
this reality, requiring less compile time awareness of various sub-systems to
create performant builds.&lt;/p&gt;
&lt;p&gt;I hope new standards like &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://web.dev/hands-on-portals&quot;&gt;Portals&lt;/a&gt; &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/tc39/proposal-realms&quot;&gt;Realms&lt;/a&gt; will make truely encapsulated
sub systems on the client a viable reality without paying iFrame overhead.&lt;/p&gt;
&lt;h4 id=&quot;polyglot-typed-rpc-systems&quot;&gt;&lt;a href=&quot;#polyglot-typed-rpc-systems&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Polyglot Typed RPC Systems&lt;/h4&gt;
&lt;p&gt;I hope that tools like gRPC will reduce the cost of communicating across
encapsulated sub systems by preserving type information across languages,
reducing performance overhead and having consistent interoperation when
communicating across network boundaries.&lt;/p&gt;
&lt;h4 id=&quot;containers&quot;&gt;&lt;a href=&quot;#containers&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Containers&lt;/h4&gt;
&lt;p&gt;Containers have created a wonderful encapsulation model and I hope tools like
Kubernetes will continue to thrive.&lt;/p&gt;
&lt;h3 id=&quot;other-ideas&quot;&gt;&lt;a href=&quot;#other-ideas&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Other Ideas&lt;/h3&gt;
&lt;p&gt;Here are a few high-level ideas that can mechanistically reduce the cost of
consensus and allow you to scale your organization as a set of small teams.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mono Repos, Modules &amp;amp; Interfaces&lt;/li&gt;
&lt;li&gt;Actor architectures&lt;/li&gt;
&lt;li&gt;Abstraction as a common language&lt;/li&gt;
&lt;li&gt;The Levels of Process, from implicit people-oriented processes to automated
processes&lt;/li&gt;
&lt;li&gt;Relying on automation to reflect team boundaries, for example, disallowing
importing from particular directories without going through a particular
interface. Tools like Prettier leverage automation to drive down the cost of
consensus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lastly, if you’d like to play with different values for the visualization used
throughout this article, here you go:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chart of the cost of alignment as a team grows to 8 people with an alignment effectiveness of 0.2. The cost curves upward as people are added, reaching 22.4 at 8 people. Read this article on the site to see it.&lt;/em&gt;&lt;/p&gt;
&lt;h5 id=&quot;a-note-on-top-down-alignment&quot;&gt;&lt;a href=&quot;#a-note-on-top-down-alignment&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Note On Top Down “Alignment”&lt;/h5&gt;
&lt;p&gt;Alignment is so valuable that it is tempting for leaders to try and force
alignment using top-down mandates. Given the cost of consensus is so high, I can
understand this impulse but the cost of imposed alignment is much higher. People
disengage, they can’t bring their best self to work, they don’t surface
important feedback, they look out for themselves. This course of action creates
a specter of alignment at best and it looks so little like authentic alignment
that I don’t think it belongs in this article at all.&lt;/p&gt;
&lt;p&gt;I’d rather fight the good fight for authentic alignment than fall for any
artificial versions of it.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Headless User Interface Components</title><link>https://www.merrickchristensen.com/articles/headless-user-interface-components</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/headless-user-interface-components</guid><description>A headless component is a component that offers maximum visual flexibility by providing no interface.</description><pubDate>Fri, 22 Jun 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;&lt;/span&gt; headless user interface component is a component that offers maximum visual
flexibility by providing no interface. “Wait for a second, are you advocating a
user interface pattern that doesn’t have a user interface?”&lt;/p&gt;
&lt;p&gt;Yes. That is exactly what I’m advocating.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;coin-flip-component&quot;&gt;&lt;a href=&quot;#coin-flip-component&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Coin Flip Component&lt;/h2&gt;
&lt;p&gt;Suppose you had a requirement to implement a coin flip feature that performed
some logic when it is rendered to emulate a coin flip! 50% of the time the
component should render “Heads” and 50% of the time it should render “Tails”.
You say to your product manager, “Oof that will take years of research!”, and
you get to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Turns out emulating coin flips is way easier than you thought so you proudly
share the results. You get a response, “This is great! Could you please update
it to show these cool coin images?”. No problem!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/heads.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/tails.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Soon, they’d like to use your &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; component in the marketing material
to show people how cool your new feature is. “We’d like to put in the blog post,
but we need the labels “Heads” &amp;amp; “Tails” back, for SEO and stuff.” Oh man, I
guess we’ll add a flag for the marketing site?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// We&amp;#39;ll default to false to avoid breaking the applications&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// current usage.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showLabels&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/heads.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/* Add these labels for the marketing site. */&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showLabels&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/tails.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/* Add these labels for the marketing site. */&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showLabels&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Later, a requirement emerges. “We were wondering if you could add a button to
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, but only in the application, to rerun the odds?”. Things are
starting to get ugly, I can’t even look Kent C. Dodds in the eyes anymore:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flipResults&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;static&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaultProps&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showLabels&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// We don&amp;#39;t repurpose `showLabels`, we aren&amp;#39;t animals, after all.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showButton&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Use fragments so people take me seriously.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;showButton&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Reflip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;flipResults&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/heads.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showLabels&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/tails.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;showLabels&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Soon a co-worker reaches out to you. “Hey, your &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; feature is rad!
We just got assigned the new &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;DiceRoll&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; feature and we’d like to reuse your
code!”. The new dice feature:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wants to “re-run” the odds &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;onClick&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Wants to be displayed in the application and marketing site as well.&lt;/li&gt;
&lt;li&gt;Has a totally different interface.&lt;/li&gt;
&lt;li&gt;Has different odds.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You now have two options, replying “Sorry, not much to share here.” or adding
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;DiceRoll&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; complexity into &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; as you watch the bones of your component
break under the weight of its responsibility. (Is there a market for brooding
programmer poets? I’d love to pursue that craft.)&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;enter-headless-components&quot;&gt;&lt;a href=&quot;#enter-headless-components&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Enter Headless Components&lt;/h2&gt;
&lt;p&gt;Headless user interface components separate the logic &amp;amp; behavior of a component
from its visual representation. This pattern works great when the logic of a
component is sufficiently complex and decoupled from its visual representation.
A headless implementation of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; as a
&lt;a href=&quot;/articles/function-as-child-components&quot;&gt;function as child component&lt;/a&gt; or render
prop would look like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flipResults&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;flip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isHeads&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;flipResults&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This component is headless because it doesn’t render anything, it expects the
various consumers to do the presentation work while it tackles the logic
lifting. So the application code would look like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isHeads&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Reflip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isHeads&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/heads.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/tails.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The marketing website code:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isHeads&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isHeads&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/heads.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Heads&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/tails.svg&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Tails&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Isn’t this great! We’ve completely untangled the logic from the presentation!
This gives us so much visual flexibility! I know what you’re thinking…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You mindless sack of idiot! Isn’t that just a render prop?!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This headless component happens to be implemented as a render prop, yes! It
could just as well be implemented as a higher order component. &lt;em&gt;Looks over my
shoulder, in a hushed low tone.&lt;/em&gt; It could have even been implemented as a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;View&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
and a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Controller&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Or a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ViewModel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; and a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;View&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. The point here is about
separating the “mechanism” of flipping coins and the “interface” to that
mechanism.&lt;/p&gt;
&lt;h3 id=&quot;what-about-diceroll-&quot;&gt;&lt;a href=&quot;#what-about-diceroll-&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What about &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;DiceRoll&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;?&lt;/h3&gt;
&lt;p&gt;The neat thing about this separation is how easy it is to generalize our
headless component to support our co-workers new &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;DiceRoll&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; feature. Hold my
Diet Coke™:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Probability&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// By taking in a threshold property we can support&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// different odds!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this headless component we can swap out the implementation of
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; without any changes to its consumers:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;CoinFlip&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Probability&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;isHeads&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Probability&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now our co-worker can share the mechanism of our &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Probability&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; emulator!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;RollDice&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Six Sided Dice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Probability&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/* She was able to use a different event! */&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;onMouseOver&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;rerun&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Roll&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dice&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/* Totally different interface! */&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Big&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;winner&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;You&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;win&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;you&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;lose&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;most&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Probability&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty neat, eh?&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;rule-of-separation-unix-philosophy&quot;&gt;&lt;a href=&quot;#rule-of-separation-unix-philosophy&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Rule of Separation – Unix Philosophy&lt;/h2&gt;
&lt;p&gt;This is one expression of a general underlying principle, one that has been
around for a very long time! Rule 4 of the “Basics of Unix Philosophy” is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rule of Separation: Separate policy from mechanism; separate interfaces from
engines. — Eric S. Raymond&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’d like to extract a portion of that book and replace the word “policy” with
“interface”.&lt;/p&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;&lt;em&gt;Interface&lt;/em&gt; and mechanism tend to mutate on different timescales, with
&lt;em&gt;interfaces&lt;/em&gt; changing much faster than mechanism. Fashions in the look and
feel of GUI toolkits may come and go, but raster operations and compositing
are forever.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;Thus, hardwiring &lt;em&gt;interfaces&lt;/em&gt; and mechanisms together has two bad effects: It
makes &lt;em&gt;interfaces&lt;/em&gt; rigid and harder to change in response to user
requirements, and it means that trying to change &lt;em&gt;interfaces&lt;/em&gt; has a strong
tendency to destabilize the mechanism.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;long&quot;&gt;
&lt;p&gt;On the other hand, by separating the two we make it possible to experiment
with new &lt;em&gt;interfaces&lt;/em&gt; without breaking mechanism. We also make it much easier
to write good tests for the mechanism (&lt;em&gt;interfaces&lt;/em&gt;, because &lt;em&gt;they&lt;/em&gt; age so
quickly, often do not justify the investment).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I love the great insights here! This also gives us some insight as to when it is
useful to use the headless component pattern.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How long will this component live for? Is it worth deliberately preserving
the mechanism aside from the interface? Perhaps to use this mechanism in
another project with a different look and feel?&lt;/li&gt;
&lt;li&gt;How frequently is our interface bound to change? Will the same mechanism
have multiple interfaces?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is an indirection cost paid when you separate “mechanism” and “policy”.
You need to be sure that the benefits of separation merit the expense of
indirection. I think this is largely where a lot of the MV* patterns of the
past went wrong, they started with the axiom that &lt;em&gt;everything&lt;/em&gt; should be
separated this way; when in reality, mechanism and policy are often deeply
coupled or the cost of separation doesn’t outweigh the benefits of this sort of
separation.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;open-source-headless-components-and-non-trivial-references&quot;&gt;&lt;a href=&quot;#open-source-headless-components-and-non-trivial-references&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Open Source Headless Components &amp;amp; Non-Trivial References&lt;/h2&gt;
&lt;p&gt;For a truly exemplar non-trivial headless component, check out a project by my
friend &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://kentcdodds.com/&quot;&gt;Kent C. Dodds&lt;/a&gt; over at Paypal called
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/paypal/downshift&quot;&gt;downshift&lt;/a&gt;. In fact, it is downshift that
ultimately inspired this post. Without providing any user interface, downshift
offers sophisticated autocomplete/dropdown/select experiences that are
accessible. Take a look at all the ways it can be used
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://downshift.netlify.com/?selectedKind=Examples&amp;amp;selectedStory=basic&amp;amp;full=0&amp;amp;addons=1&amp;amp;stories=1&amp;amp;panelRight=0&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I sincerely hope that more projects like downshift emerge over time. I can’t
count how many times I’ve wanted to use a particular open source UI component
but couldn’t because it wasn’t “themeable” or “skinnable” in the way that met
design requirements. Headless components circumvent this problem entirely with a
“bring your own interface” requirement.&lt;/p&gt;
&lt;p&gt;In a world where design systems and user interface libraries are headless, your
interfaces can have a high-end custom feel &lt;em&gt;and&lt;/em&gt; the durability &amp;amp; accessibility
of a great open source library. You spend your time implementing the only part
that you needed to, the part that is truly unique, the look and feel specific to
your application.&lt;/p&gt;
&lt;p&gt;I could go on about the benefits from internationalization to E2E test
integration but I’d recommend you try it out for yourself.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Stateful Semantic Diffing</title><link>https://www.merrickchristensen.com/articles/stateful-semantic-diffing</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/stateful-semantic-diffing</guid><description>A journey trying to build an intelligent code assistant.</description><pubDate>Fri, 23 Dec 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ for offering little to no value from the
moment it was written.&lt;/p&gt;
&lt;p&gt;I’m trying to infer programmer intention by observing semantic changes as they
edit files. My first attempt was to parse the syntax trees to determine the
changes made by the programmer. I first used a generic diff implementation but
quickly realized I would need somethign more semantically aware in able to infer
any serious meaning about the changes intended by the programmer. I started
reading about change detection algorithms which meant looking up a lot of
mathematical symbols I’m not accustomed to.&lt;/p&gt;
&lt;p&gt;As seems to always be the case with “great ideas that nobody has done” I’ve run
into a lot of unforseen issues. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Say a programmer changes this variable name:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The code assistant should note the change as occurs, character by character. As
we diff the two trees we might see the following events:&lt;/p&gt;
&lt;p&gt;The cursor jumps down to the end of name, and hits backspace:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;nam&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And another:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;na&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And another:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And one more:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But wait, we can’t have an empty identifier, that won’t parse… So, we need to
wait till we are parseable again, the developer types “m”&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And one last event:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;node_type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok, now the code assistant should suggest that you update the use of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;
found in &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, this poses a really challenging issue. Connecting “me”
to “name”. The variable was “name” a long time ago, so how do we know to suggest
name to me at this point? Do we need to persist the scope some place? That we
can adjust references as we receive changes? So &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; references are updated to
&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;nam&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;na&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, (parse failure), &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;me&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. And after even &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;identifier&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; change
events we suggest updating? How do we know “name” is the good state for
reference? How do we avoid pointing variables inbetween name to me, meaning if
there were also a variable “nam” how do we avoid accidentally pointing nam to
me? I suppose by checking if there is a corresponding VariableDeclarator for nam
I could avoid destructive suggestions.&lt;/p&gt;
&lt;p&gt;Conclusion for the day: My mind is tired. I anticipated this would be extremely
difficult but in my initial excitment I definitely believed it would be easier
than this. AI would be a long term goal, I’m just trying to solve the problem of
determining programmer intention using stateful change observation at this
point. I’ve been battling a lot shame and self-confidence issues as I’ve faced
friction. Hard not to feel stupid, or that I should have gone to school. I can’t
help but feel inadequate as it takes me 2 hours to read 6 pages to try and
comprehend it and look up mathematical symbols on wikipedia.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;resources-used&quot;&gt;&lt;a href=&quot;#resources-used&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Resources Used&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://en.wikipedia.org/wiki/List_of_mathematical_symbols&quot;&gt;List of Mathematical Symbols&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://ilpubs.stanford.edu:8090/115/1/1995-46.pdf&quot;&gt;Change Detection in Hierarchically Structured Information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://hal.archives-ouvertes.fr/hal-01054552/document&quot;&gt;Fine-grained and Accurate Source Code Differencing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Function as Child Components</title><link>https://www.merrickchristensen.com/articles/function-as-child-components</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/function-as-child-components</guid><description>Function as Child Components a useful technique for higher order components.</description><pubDate>Sat, 30 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;I&quot;&gt;I&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;&lt;/span&gt; recently polled on Twitter regarding Higher Order Components and Function as
Child, the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/iammerrick/status/735254529474629633&quot;&gt;results&lt;/a&gt;
were surprising to me.&lt;/p&gt;
&lt;p&gt;If you don’t know what the “Function as Child” pattern is, this article is my
attempt to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Teach you what it is.&lt;/li&gt;
&lt;li&gt;Convince you of why it is useful.&lt;/li&gt;
&lt;li&gt;Get some fetching hearts, or retweets or likes or newsletters or something,
I don’t know. I just want to feel appreciated, you know?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;what-are-function-as-child-components&quot;&gt;&lt;a href=&quot;#what-are-function-as-child-components&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What are Function as Child Components?&lt;/h3&gt;
&lt;p&gt;“Function as Child Component”s are components that receive a function as their
child. The pattern is simply implemented and enforced thanks to React’s property
types.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Scuba Steve&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;propTypes&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is it! By using a Function as Child Component we decouple our parent
component and our child component letting the composer decide what &amp;amp; how to
apply parameters to the child component. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And somebody else, using the same component could decide to apply the name
differently, perhaps to an attribute:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;’&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;scuba-steves-picture&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jpg’&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What is really neat here is that MyComponent, the Function as Child Component
can manager state on behalf of components it is composed of, without making
demands on how that state is leveraged by its children. Let’s move on to a more
realistic example.&lt;/p&gt;
&lt;h4 id=&quot;the-ratio-component&quot;&gt;&lt;a href=&quot;#the-ratio-component&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Ratio Component&lt;/h4&gt;
&lt;p&gt;The Ratio Component will use the current device width, listen for resize events
and call into its children with a width, height, and some information about
whether or not it has computed the size yet.&lt;/p&gt;
&lt;p&gt;First, we start out with a Function as Child Component snippet, this is common
across all Function as Child Component’s and it just lets consumers know we are
expecting a function as our child, not React nodes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;propTypes&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next lets design our API, we want a ratio provided in terms of X and Y axis
which we will then use the current width to compute, lets set up some internal
state to manage the width and height, whether or not we have even calculated
that yet, along with some propTypes and defaultProps to be good citizens for
people using our component.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;propTypes&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;defaultProps&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright so we aren’t doing anything interesting yet, let’s add some event
listeners and actually calculate the width (accommodating as well for when our
ratio changes):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleResize&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleResize&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getComputedDimensions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;componentWillReceiveProps&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getComputedDimensions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;componentDidMount&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getComputedDimensions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;resize&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleResize&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;componentWillUnmount&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;removeEventListener&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;resize&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleResize&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;handleResize&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getComputedDimensions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;hasComputed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;propTypes&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;isRequired&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;defaultProps&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright, so I did a lot there. We added some event listeners to listen for
resize events as well as actually computing the width and height using the
provided ratio. Neat, so we’ve got a width and height in our internal state, how
can we share it with other components?&lt;/p&gt;
&lt;p&gt;This is one of those things that is hard to understand because it is so simple
that when you see it you think, “That can’t be all there is to it.” but this
**&lt;em&gt;is&lt;/em&gt; **all there is to it.&lt;/p&gt;
&lt;h5 id=&quot;children-is-literally-just-a-javascript-function&quot;&gt;&lt;a href=&quot;#children-is-literally-just-a-javascript-function&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Children is literally just a JavaScript function.&lt;/h5&gt;
&lt;p&gt;That means in order to pass the calculated width and height down we just provide
them as parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now anyone can use the ratio component to provide a full width and properly
computed height in whatever way they would like! For example, someone could use
the Ratio component for setting the ratio on an img:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/scuba-steve-image.png&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Meanwhile, in another file, someone has decided to use it for setting CSS
properties.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Hello&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;world&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And in another app, someone is using to conditionally render different children
based on computed height:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;hasComputed&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;TOO_TALL&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;TallThing&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;NotSoTallThing&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Ratio&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;strengths&quot;&gt;&lt;a href=&quot;#strengths&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Strengths&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;The developer composing the components owns how these properties are passed
around and used.&lt;/li&gt;
&lt;li&gt;The author of the Function as Child Component doesn’t enforce how its values
are leveraged allowing for very flexible use.&lt;/li&gt;
&lt;li&gt;Consumers don’t need to create another component to decide how to apply
properties passed in from a “Higher Order Component”. Higher Order
Components typically enforce property names on the components they are
composed with. To work around this many providers of “Higher Order
Components” provide a selector function which allows consumers to choose
your property names (think redux-connects select function). This isn’t a
problem with Function as Child Components.&lt;/li&gt;
&lt;li&gt;Doesn’t pollute “props” namespace, this allows you to use a “Ratio”
component and a “Pinch to Zoom” component together regardless that they are
both calculating width. Higher Order Components carry an implicit contract
they impose on the components they are composed with, unfortunately this can
mean colliding prop names being unable to compose Higher Order Components
with other ones.&lt;/li&gt;
&lt;li&gt;Higher Order Components create a layer of indirection in your development
tools and components themselves, for example setting constants on a Higher
Order Component will be inaccessible once wrapped in a Higher Order
Component. For example:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeContant&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;SCUBA&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then wrapped by a Higher Order Component,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RIP your constant. It is no longer accessible without the Higher Order Component
providing a function to access the underlying component class. Sad.&lt;/p&gt;
&lt;h5 id=&quot;summary&quot;&gt;&lt;a href=&quot;#summary&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Summary&lt;/h5&gt;
&lt;p&gt;Most the time when you think “I need a Higher Order Component for this shared
functionality!” I hope I have convinced you that a Function as Child Component
is a better alternative for abstracting your UI concerns, in my experience, it
nearly always is, with the exception that your child component is truly coupled
to the Higher Order Component it is composed with.&lt;/p&gt;
&lt;h5 id=&quot;an-unfortunate-truth-about-higher-order-components&quot;&gt;&lt;a href=&quot;#an-unfortunate-truth-about-higher-order-components&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;An Unfortunate Truth About Higher Order Components&lt;/h5&gt;
&lt;p&gt;As an ancillary point, I believe that Higher Order Components are improperly
named though it is probably too late to try and change their name. A higher
order function is a function that does at least one of the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Takes n functions as arguments.&lt;/li&gt;
&lt;li&gt;Returns a function as a result.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Indeed Higher Order Components do something similar to this, namely, take a
Component as an argument and return a Component but I think it is easier to
think of a Higher Order Component as a factory function, it is a function that
dynamically creates a component to allow for runtime composition of your
components. However, they are &lt;strong&gt;unaware&lt;/strong&gt; of your React state and props at
composition time!&lt;/p&gt;
&lt;p&gt;Function as Child Components allows for similar composition of your components
with the benefit of having access to state, props and context when making
composition decisions. Since Function as Child Components:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take a function as an argument.&lt;/li&gt;
&lt;li&gt;Render the result of said function.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I can’t help but feel they should have gotten the title “Higher Order
Components” since it is a lot like higher order functions only using the
component composition technique instead of functional composition. Oh well, for
now, we will keep calling them “Function as Child Components” which is just
wordy and gross sounding.&lt;/p&gt;
&lt;h4 id=&quot;examples&quot;&gt;&lt;a href=&quot;#examples&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Examples&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/iammerrick/c4bbac856222d65d3a11dad1c42bdcca&quot;&gt;Pinch to Zoom – Function as Child Component&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/chenglou/react-motion&quot;&gt;react-motion&lt;/a&gt; This project
introduced me to this concept after being a long time Higher Order Component
convert.&lt;/li&gt;
&lt;/ol&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Single State Tree + Flux</title><link>https://www.merrickchristensen.com/articles/single-state-tree</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/single-state-tree</guid><description>A brief Flux explanation as a pre-cursor for single state tree goodness.</description><pubDate>Sun, 30 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;W&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;hen people ask&lt;/span&gt; me how I build user interfaces these days they often stare back
at me with wide-eyed shock when I tell them I manage all my state in a single
tree using Flux to populate it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wait a minute, you store everything in a single tree? Like one giant variable?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yup. And it’s awesome.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Really?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Totes McGoats&lt;/p&gt;
&lt;h3 id=&quot;what-is-the-single-state-tree-anyways&quot;&gt;&lt;a href=&quot;#what-is-the-single-state-tree-anyways&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is the “single state tree” anyways?&lt;/h3&gt;
&lt;p&gt;In order for me to make my audacious claims of why I think this approach is
awesome, let me first explain the approach. It’s really quite simple, all of
your application’s state is managed in a single tree. The tree is populated
using a concept called “actions”.&lt;/p&gt;
&lt;h4 id=&quot;what-are-actions&quot;&gt;&lt;a href=&quot;#what-are-actions&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What are actions?&lt;/h4&gt;
&lt;p&gt;Actions are serialized representations of events that get dispatched your
“store”, your stores job is to manage that single state tree. Some examples of
actions:&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;results&lt;/em&gt; of an HTTP request:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;FETCH_COMMENTS_SUCCESS&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A user interaction:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;SAVE_COMMENT&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or any other type of state changing mechanism.&lt;/p&gt;
&lt;h4 id=&quot;what-is-a-store&quot;&gt;&lt;a href=&quot;#what-is-a-store&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is a store?&lt;/h4&gt;
&lt;p&gt;Your store receives each action and figures out what state to derive from it.
For example, the system make a request to get the latest comments, it then
dispatches an action, the store then says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ahhh, &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FETCH_COMMENTS_SUCCESS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, I know precisely what to do with you, I save
your &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; into cache and notify my observers that state has changed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So what does this process look like for a typical “Download and Show Data”
requirement? Well first we have what we call an “action creator” which is really
just a function that creates an action object, or a serialized representation of
a state change, and dispatches it to the store. So it all starts with an action
creator:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getComments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/post/single-state-tree/comments&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;FETCH_COMMENTS_SUCCESS&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We then have a store with a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; function that manages all state changes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;FETCH_COMMENTS_SUCCESS&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Aww yes my good sir, I know precisely what to do with you.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Set next state...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These two are then combined accordingly to dispatch the action.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getComments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Typically dispatch is associated with a store, I’ll get into that in just a bit.
Anyways, subscribers to state changes are then notified, “Hey Miss, your state
looks different!”&lt;/p&gt;
&lt;h4 id=&quot;what-is-a-single-state-tree&quot;&gt;&lt;a href=&quot;#what-is-a-single-state-tree&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is a single state tree?&lt;/h4&gt;
&lt;p&gt;A single state tree is a single tree that represents your state. This approach
is different than traditional flux in that you have a singular store which
manages all of your states in one mega tree. First, though let’s recap some of
the benefits of Flux.&lt;/p&gt;
&lt;h3 id=&quot;benefits-of-flux&quot;&gt;&lt;a href=&quot;#benefits-of-flux&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Benefits of Flux&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Using actions to represent state changes provides a serializable data format
for all your systems state changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Ever wondered how your application got into a particular state? Wonder no
more, we now have a frame by frame replay of every state change your system
has ever experienced.&lt;/li&gt;
&lt;li&gt;This frame by frame replay is shareable, imagine a bug report with a
downloadable “reproduce” file. You simply &lt;em&gt;play&lt;/em&gt; the “reproduce” file and get
the same bug.&lt;/li&gt;
&lt;li&gt;This frame by frame replay is analyzable. Imagine recording all your user
tests and using analysis tools to get deeper insights into how people interact
with your system. Also, optimization opportunities anyone?&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;All of your state changes are passed through a single mechanism.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;A developer can walk into a system and know every potential state changing
piece of code there is by looking at your action’s constants.&lt;/li&gt;
&lt;li&gt;Developers can author “middleware”, or functions that each action is passed
through. This enables things like logging each state change, having different
types of actions such as thunks or promises, implementing analytics, the
possibilities are only as limited as our creativity.&lt;/li&gt;
&lt;li&gt;Developer tooling hook into every state change, holy awesome.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Synchronous UI&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;UI is rendered synchronously, every time. No more this state change caused
this state change, caused this state change, caused this state change. Just
here is the current state, what does the UI look like with this state? Just
think about it, your UI as a pure function… ever heard of UI so easy to
test? Me either.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;Decouples actions from state changes. This means you can have one action
make multiple state changes. For example, HTTP responses are decoupled from
state changes. This is useful for endpoints that contain nested entities.
For example, say you download all of the comments and they come back with
nested user objects, with flux you can simply populate the user section of
the tree, next time someone asks for that user, you can skip the request
because you know you have the sufficient state.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The questions, “What is my state?” &amp;amp; “When does my state change?” is
answered simply instead of being littered throughout your application code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ok, that all sounds great but at what cost! I hear you gasping…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But, but, but this approach seems unwieldy and infeasible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Does it, dear friend? It’s not. There are tools to rope in the hard parts. Here
is an example of my tool of choice for leveraging this technique, called Redux.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;redux&quot;&gt;&lt;a href=&quot;#redux&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Redux&lt;/h2&gt;
&lt;p&gt;Redux has a remarkably simple interface. And its job is solving precisely what
this article is all about, a single state tree managed by actions. Let’s start
out by making a store, in redux this function is called &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;createStore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;creating-a-store&quot;&gt;&lt;a href=&quot;#creating-a-store&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Creating a Store&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;createStore&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;redux&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;createStore&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When we call &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;createStore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; we give it our action handler or our &lt;em&gt;reducer&lt;/em&gt;. The
reducers job is to take the current state and the action and return the next
state. Following our example above let’s write a simple reducer.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reducer&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;FETCH_COMMENTS_SUCCESS&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;createStore&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reducer&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Writing a reducer like this can get a little unwieldy because you are managing
the structure of your tree yourself, thankfully Redux offers a little utility
function called combineReducers, its job is to take multiple reducers and manage
the tree structure for you. It can be as nested as you like but we’ll
demonstrate a flat tree below.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reducerTree&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;FETCH_COMMENTS_SUCCESS&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;createStore&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;combineReducers&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reducerTree&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now our comments reducer is just the reducer for comments, our user reducer is
just the reducer for users etc.. Our state tree would look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;posts&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice how it matches the reducerTree we provided to combineReducers?&lt;/p&gt;
&lt;p&gt;Since we have our reducer wired up when we call &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dispatch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; on the store with
that particular action, the store’s state tree will change to a copied state
tree with the comments included. But how do we access this state tree? Well its
pretty simple really, we call &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getState&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This can be called at any point in time to retrieve your applications current
state but you typically call it &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;onSubscribe&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Which lets you listen for changes
to the state and do something accordingly, you know, like render your interface
again.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;store&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ui&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This gives you simple, &lt;em&gt;synchronous&lt;/em&gt; renders, where each render is not a mix of
changes over time but a singular snapshot of state at a given point in time.&lt;/p&gt;
&lt;h4 id=&quot;benefits-of-single-state-tree&quot;&gt;&lt;a href=&quot;#benefits-of-single-state-tree&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Benefits of Single State Tree&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Improved developer tooling. Since all your state exists in one location,
other parts of your application can be reloaded &lt;em&gt;without&lt;/em&gt; blasting your
state. Gone are the days of reloading your entire application, clicking
different things to get your application into that state you are working on
and testing your changes. Instead, you simply reload that one file and your
application’s state stays intact. You can do this kind of hot reloading with
different tools in the ecosystem.&lt;/li&gt;
&lt;li&gt;Shared cache across your system. When one section of your application
downloads a user, its there for the other pieces of your application that
use that user, no HTTP request required.&lt;/li&gt;
&lt;li&gt;Your entire applications state can be viewed in one structure (and shared as
one structure) see benefits of Flux above.&lt;/li&gt;
&lt;li&gt;The majority of your applications state management are pure functions, hello
testability.&lt;/li&gt;
&lt;li&gt;Your applications state can be simply bootstrapped from the server, hello
server-side rendering.&lt;/li&gt;
&lt;li&gt;State changes are predictable.&lt;/li&gt;
&lt;li&gt;Undo &amp;amp; Redo are practically free.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;#further-reading&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://rackt.github.io/redux/index.html&quot;&gt;Redux Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/gaearon/react-hot-loader&quot;&gt;React Hot Reloader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/gaearon/redux-devtools&quot;&gt;Redux Developer Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>React + Angular DI</title><link>https://www.merrickchristensen.com/articles/react-angular-di</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/react-angular-di</guid><description>Dependency injection with Angular 2&apos;s dependency injector, React and react-router.</description><pubDate>Sat, 20 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 – Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ because it was a terrible (but fun)
idea.&lt;/p&gt;
&lt;p&gt;I have been deliberating on the topic of writing testable React code without
singletons and service locator “injection” for some time. My
&lt;a href=&quot;/articles/react-dependency-injection&quot;&gt;last article&lt;/a&gt; proposed a very
straightforward approach and discussed why I am chasing these goals. Well, I am
very happy to say that I feel I’ve settled on an approach and an unlikely one at
that. I believe the following approach offers the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Code isn’t “coupled” to the dependency injector, it can be run without it
using vanilla constructor injection.&lt;/li&gt;
&lt;li&gt;Code is testable without module system level mocking.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Link to the discussed project is
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/iammerrick/ng-react-router&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;dijs&quot;&gt;&lt;a href=&quot;#dijs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;di.js&lt;/h3&gt;
&lt;p&gt;No front-end web framework has pioneered testability like Angular.js. At the
forefront of this effort is the dependency injector. Angular 2 has a little
known, &lt;em&gt;fantastic&lt;/em&gt;, project in the works called
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/angular/di.js/&quot;&gt;di.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;di.js gives us the testability of a dependency injector but the ease of use of a
module system.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;react&quot;&gt;&lt;a href=&quot;#react&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;React&lt;/h3&gt;
&lt;p&gt;React has pioneered the virtual DOM and the most fantastic component
compose-ability I’ve seen to date. React dominates the UI.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;dijs-react&quot;&gt;&lt;a href=&quot;#dijs-react&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;di.js + React&lt;/h3&gt;
&lt;p&gt;Lets take a look at pairing up di.js &amp;amp; React. While we’re add it lets use the
fantastic react-router library.&lt;/p&gt;
&lt;h5 id=&quot;bootstrapjs&quot;&gt;&lt;a href=&quot;#bootstrapjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;bootstrap.js&lt;/h5&gt;
&lt;p&gt;The first thing we need is a bootstrap file, think main() function in Java or C.
This just gets the app up and running.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Router&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./Router&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;react&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Make the injector&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;injector&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Grab the Router&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Router&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Get it up and running and render it into the DOM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;router&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Handler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Handler&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;routerjs&quot;&gt;&lt;a href=&quot;#routerjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Router.js&lt;/h5&gt;
&lt;p&gt;Now we create the Router and inject the corresponding Routes. Notice we annotate
the Router to inform di.js what to inject, the cool thing is though, we could
just inject our own Routes manually at test time. Rad, eh?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ReactRouter&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;react-router&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./routes&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Router&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ReactRouter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;routes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Inject the Routes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Router&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Inject&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Router&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;routesjs&quot;&gt;&lt;a href=&quot;#routesjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Routes.js&lt;/h5&gt;
&lt;p&gt;Same story here, just define the Routes and inject AppHandler to deal with the
base route.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Route&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;react-router&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;react&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;Route&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Inject&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Routes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;apphandlerjs&quot;&gt;&lt;a href=&quot;#apphandlerjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;AppHandler.js&lt;/h5&gt;
&lt;p&gt;Notice, we can inject child components to use in our component.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;react&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Inject&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppHandler&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;childcomponentjs&quot;&gt;&lt;a href=&quot;#childcomponentjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;ChildComponent.js&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;react&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;alertInExcitement&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;handleClick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;I am a child component. Click me!&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Inject&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;ChildComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;appactionsjs&quot;&gt;&lt;a href=&quot;#appactionsjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;AppActions.js&lt;/h5&gt;
&lt;p&gt;One of my favorite pieces here, AppActions has no dependencies so we can just
construct an ES6 class.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;alertInExcitement&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;I am so excited!&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;AppActions&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Take a look at AppActions, could a file be easier to test? It is literally just
a class.(Aside from calling alert, gross.) Notice that even the code that does
have dependencies can still be constructed by hand, neat right?&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;thoughts&quot;&gt;&lt;a href=&quot;#thoughts&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Thoughts&lt;/h3&gt;
&lt;p&gt;I am going to travel this path a little further and perhaps write an update,
di.js could probably use some utility functions for non AtScript code,
annotations in long form is a little tedious but other than that I am very
satisfied and excited about this technique.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;credits&quot;&gt;&lt;a href=&quot;#credits&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Credits&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;A conversation a few years ago with Igor Minar, Angular’s tech lead, that
convinced me that “service locator” mocking was a bad idea; and that a
dependency injector is in fact a very useful tool.&lt;/li&gt;
&lt;li&gt;Ryan Florence for
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/rpflorence/create-container&quot;&gt;create-container&lt;/a&gt; and
making react-router injector friendly&lt;/li&gt;
&lt;/ol&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>React Dependency Injection</title><link>https://www.merrickchristensen.com/articles/react-dependency-injection</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/react-dependency-injection</guid><description>Constructor Dependency Injection with React.js</description><pubDate>Sat, 15 Nov 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ because I think writting object oriented
React is the wrong approach for a number of reasons.&lt;/p&gt;
&lt;h3 id=&quot;update-june-5-2016&quot;&gt;&lt;a href=&quot;#update-june-5-2016&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 5, 2016&lt;/h3&gt;
&lt;p&gt;React has removed automatically exporting factory functions from createClass.
This means, components can no longer be called as functions that accept their
properties. In order to get the same effect, you must call React.createFactory
before calling your component as a function.&lt;/p&gt;
&lt;p&gt;This:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Becomes this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createFactory&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To be clear, the recommended use in your application’s code is to leverage JSX.
In order to follow along with this article, without the overhead of JSX,
components should be wrapped in createFactory. (Which JSX effectively does for
you by compiling to React.createElement). See
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/sebmarkbage/d7bce729f38730399d28&quot;&gt;this deprecation notice&lt;/a&gt;
for more information.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;react-dependency-injection&quot;&gt;&lt;a href=&quot;#react-dependency-injection&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;React Dependency Injection&lt;/h2&gt;
&lt;p&gt;I love React.js. I find it to be a powerful tool for creating UI and revel in
its &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Direct_mode&quot;&gt;immediate mode&lt;/a&gt; rendering model.
Unforunately however, the dominant approach for writing React applications is
use singletons at the module level. Here is an example of what I mean:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getCount&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The trouble with this approach is that it is difficult to test. You typically
need to add some sort of reset functionality to your module, like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getCount&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That way in your unit tests you can reset the corresponding state to its
original place. This can get very complex and tedious depending on how much or
how complex the state in your module is. Because of this people tend to just
throw away the entire module and re-evaluate it each time. That way, each test
gets the benefit of fresh state, and you don’t have to write reset methods. This
is the way Facebook’s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://facebook.github.io/jest/&quot;&gt;Jest&lt;/a&gt; works and my own
library, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/iammerrick/Squire.js/&quot;&gt;Squire.js&lt;/a&gt;. This is
problematic for a few reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It’s slower, you are reevaluating the module several times.&lt;/li&gt;
&lt;li&gt;The module still has the same state for an entire test file, multiple it()
blocks would still need to reset state or require() the module in each it()
block. Slow and difficult to test.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Service_locator_pattern&quot;&gt;service locator&lt;/a&gt;, not
a &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Dependency_injection&quot;&gt;dependency injector&lt;/a&gt;.
Using it for both conflates it’s use violating the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Single_responsibility_principle&quot;&gt;single responsibility principle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In tests uses of instanceof can break because you could be getting a
different instance for each &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Code is now encouraged to be written in the form of singletons which is
problematic for it’s
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons&quot;&gt;own reasons&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;a-different-approach&quot;&gt;&lt;a href=&quot;#a-different-approach&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Different Approach&lt;/h2&gt;
&lt;p&gt;I wanted to offer a different approach that seems to solve the requirements I
have which are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No singletons, re-evaluation or reset methods required for tests.&lt;/li&gt;
&lt;li&gt;Code must remain easy to understand.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;react-properties&quot;&gt;&lt;a href=&quot;#react-properties&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;React Properties&lt;/h3&gt;
&lt;p&gt;The method for passing anything to a React Element is to use properties,
properties are passed in as the first argument of a React Element. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This would render the following HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Properties are effectively the technique one can use to pass things to the
component which are not child elements. The neat thing is you can even set
default properties. Check this out:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getDefaultProps&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Scuba Steve&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This would render what you would expect:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello Scuba Steve&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Have you made the connection yet? We can use React Properties to inject
dependencies to our components. Check this out:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getDefaultProps&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getInitialState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, the code is just as tractable as it is using the singleton approach, you
can see right where the dependencies exist on the file system, but here is where
it gets cool… We can pass in a different view model under test, like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;./MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mockHTTP&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Would probably return a promise.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Async Name&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mockHTTP&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this approach we get the following benefits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We can specify default implementations of dependencies.&lt;/li&gt;
&lt;li&gt;We can inject different dependencies if we would like (for example under
test).&lt;/li&gt;
&lt;li&gt;The code is just as tractable as it is using modules as singletons.&lt;/li&gt;
&lt;li&gt;We are coding to an interface not an implementation.&lt;/li&gt;
&lt;li&gt;No more re-evaluation of code for tests or global state.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;bonus&quot;&gt;&lt;a href=&quot;#bonus&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Bonus&lt;/h3&gt;
&lt;p&gt;A neat side-effect of this approach is that we can use propTypes to validate our
dependencies honor a specific interface. This encourages us to code to an
interface, not and implementation.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponent&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;createClass&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;propTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;PropTypes&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getDefaultProps&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MyComponentViewModel&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;HTTP&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getInitialState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getState&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Hello &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will validate that our model has a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getState&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; method! How cool is that!?
Now we are really coding to an interface and we get that validated by React’s
type system.&lt;/p&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;real-talk&quot;&gt;&lt;a href=&quot;#real-talk&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Real Talk&lt;/h2&gt;
&lt;p&gt;This is a new idea and I’m not positive how great it is. I would love to hear
critisism and feedback in all its forms, preferably
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://twitter.com/iammerrick&quot;&gt;twitter&lt;/a&gt; or email.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Swift Notes</title><link>https://www.merrickchristensen.com/articles/swift</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/swift</guid><description>My notes trying to develop a mental model for Apple&apos;s Swift Language</description><pubDate>Tue, 03 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h4 class=&quot;top-level&quot; id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 – Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ for offering little to no value from the
moment it was written.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Type inference with sane interpolation (which takes expressions yay)! Make for
less nasty NSLog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dictionary &amp;amp; Array literal syntax. Legit. More akin to PHP than JS by syntax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;let &amp;amp; var seem to hold for reference semantics not value semantics. Think
Scala’s val &amp;amp; var.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TODO: Does for in take advantage of NSFastIteration protocol? In which case,
users could provide iterables?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expression support for control flow! Pattern matching!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ranges. Appear to be lazily computed as expected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice overloading of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to represent variadic functions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First class functions!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The closure block syntax is a little odd overloading the in keyword to
separate the interface from the implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Single line statement closures are implicit return types&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Classes look freakishly like ES6/Typescript classes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explicit override for subclasses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Weird implicit “newValue” in setters. You can explicitly set the name if you
like though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;willSet/didSet I imagine this was done to keep binding logic out of
getters/setters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The existential &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; operator is just great, reminds me of coffee script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Named parameters only exists in methods? Seems like a choice for Objective-C
interoperability, feels odd that functions don’t have the same restriction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;structs == value classes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;enums + Pattern Matching reminds me a lot of Scala’s case classes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;extensions lots like C# so far as I can tell, I’m guessing this will be used
to replace Objective-C Categories. Extending built-ins FTW!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Protocols now restrict consumers to consuming only methods in the protocol.
Awesome!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Extensible Web Summit</title><link>https://www.merrickchristensen.com/articles/extensible-web-summit</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/extensible-web-summit</guid><description>Developers, standards bodies, and browser implementors all working together to progress the web.</description><pubDate>Sat, 05 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;s I sat&lt;/span&gt; down in a half empty room located at Adobe headquarters and began to
look around it didn’t take long for me to realize how truly privileged I was to
be there. I felt humbled. Actually, I felt like an impostor, as if I had
infiltrated a secret meeting of sages deciding the fate for something of massive
importance. In representation, there were members of TC39, W3C Tag, Angular,
Polymer, Ember &amp;amp;
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Tim_Berners-Lee&quot;&gt;Sir Tim Berners-Lee&lt;/a&gt;. In fact, I
requested a picture with him for posterity but found myself feeling like a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.youtube.com/watch?v=FZQtRxsN_JU&quot;&gt;humiliated rejected Bieber fan&lt;/a&gt;
when he declined my request, and asked me to focus on the content. Touchè Mr.
Lee. Below, is a summary of that very content. ;-)&lt;/p&gt;
&lt;p&gt;The event was started with Daniel Appelquist whom I believe was the organizer of
the event. It was to be run &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/BarCamp&quot;&gt;barcamp&lt;/a&gt;
style, however, before the barcamp sessions there were a series of lightning
talks.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;img src=&quot;/assets/images/articles/extensible-web-summit/final-sessions.jpg&quot; alt=&quot;Final Sessions&quot;/&gt;&lt;figcaption&gt;Final Sessions&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 class=&quot;top-level&quot; id=&quot;lightning-talks&quot;&gt;&lt;a href=&quot;#lightning-talks&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Lightning Talks&lt;/h2&gt;
&lt;h3 id=&quot;yehuda-katz&quot;&gt;&lt;a href=&quot;#yehuda-katz&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Yehuda Katz&lt;/h3&gt;
&lt;p&gt;Yehuda noted that the “don’t break the web” requirement means that browser
vendors don’t have the liberty to “ship and iterate” in the traditional sense.
The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://extensiblewebmanifesto.org/&quot;&gt;Extensible Web Manifesto&lt;/a&gt; is about
providing primitives that allow developers to iterate in user space and
eventually merge that progression back into the platform. This enables iteration
and mitigates the burden of backward compatibility. It also empowers users to
progress the platform. He noted Polymer in particular as providing high-level
APIs in userland iteration, meanwhile leveraging that information to drive the
platform forward.&lt;/p&gt;
&lt;h3 id=&quot;jake-archibald&quot;&gt;&lt;a href=&quot;#jake-archibald&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Jake Archibald&lt;/h3&gt;
&lt;p&gt;Jake started about by lamenting the unfortunate lack of features found in the
web platform such as push notifications, offline first, background updates,
payments, alarms, geofencing, etc. He then went on to explain a new technology,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/slightlyoff/ServiceWorker&quot;&gt;Service Workers&lt;/a&gt;, that solves
many of these problems.&lt;/p&gt;
&lt;h3 id=&quot;angelina-fabbro&quot;&gt;&lt;a href=&quot;#angelina-fabbro&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Angelina Fabbro&lt;/h3&gt;
&lt;p&gt;Angelina gave a quick overview of
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.w3.org/TR/components-intro/&quot;&gt;Web Components&lt;/a&gt;. Namely,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.w3.org/TR/shadow-dom/&quot;&gt;Shadow DOM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.w3.org/TR/html-templates/&quot;&gt;Templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.w3.org/TR/html-imports/&quot;&gt;HTML Imports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.w3.org/TR/custom-elements/&quot;&gt;Custom Elements&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tab-atkins&quot;&gt;&lt;a href=&quot;#tab-atkins&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Tab Atkins&lt;/h3&gt;
&lt;p&gt;Tab opened by conceding that CSS is by far the least extensible piece of the web
platform. He then went over different ideas to open up CSS for developer
empowerment. My favorite part was the optimistic and empowering close, “The
future of CSS is open for business”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_variables&quot;&gt;CSS Variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://tabatkins.github.io/specs/css-aliases/&quot;&gt;CSS Aliases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;domenic-denicola&quot;&gt;&lt;a href=&quot;#domenic-denicola&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Domenic Denicola&lt;/h3&gt;
&lt;p&gt;Domenic shared his story about the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://promises-aplus.github.io/promises-spec/&quot;&gt;Promises/A+&lt;/a&gt; specification in
which a community born specification is now a platform-wide primitive for
thinking about asynchrony. He is now working on a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/whatwg/streams&quot;&gt;streams&lt;/a&gt; specification. I owe Domenic a
special bit of gratitude for convincing me to come to this meeting in the first
place, thank you, Domenic.&lt;/p&gt;
&lt;h3 id=&quot;jeni-tennison&quot;&gt;&lt;a href=&quot;#jeni-tennison&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Jeni Tennison&lt;/h3&gt;
&lt;p&gt;Jeni shared her work on a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/w3ctag/packaging-on-the-web&quot;&gt;specification for packaging on the web&lt;/a&gt;.
Today we optimize our applications using concatenation, however, you can’t
concatenate ES6 modules due to module scoping. There is also a large amount of
work for mitigating requests, sprites or Base64 encoding images, CSS &amp;amp; JS
concatenation etc. Packages are an answer to this problem.&lt;/p&gt;
&lt;h3 id=&quot;alex-russell&quot;&gt;&lt;a href=&quot;#alex-russell&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Alex Russell&lt;/h3&gt;
&lt;p&gt;Alex proposed the question, how does progress happen? He contended that progress
happens outside of the W3C, the W3C stamps that progress and they become
standards. Progress happens with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evidence-based consensus, e.g. polyfill.&lt;/li&gt;
&lt;li&gt;Engineers have personal experience with a problem and they fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Progress starts with changing mind and ends with changing behavior. Delivering
meaningful progress on the web requires that we ship and use evidence to iterate
on the platform.&lt;/p&gt;
&lt;h3 id=&quot;anne-van-kesteren&quot;&gt;&lt;a href=&quot;#anne-van-kesteren&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Anne van Kesteren&lt;/h3&gt;
&lt;p&gt;Anne told a story in which about a decade ago the HTML parser was standardized.
Prior to that time browsers implemented HTML in a variety of ways which meant
new specifications and standards were unreasonably difficult to agree upon and
implement. Once they got behind a standard strategy of parsing HTML a great deal
of progress was enabled. That work is leveraged as the underlying primitive for
many of the features we are working on today. The point of the story, so far as
I understood it, is that progress on the web platform requires a sort of
“archaeology” in which you unearth the underlying primitives in our existing
systems to propose meaningful ways of moving them forward. He noted a lot of
things need some archaeological work done, namely styling form controls and
content editing.&lt;/p&gt;
&lt;p&gt;All of the above happened in about thirty minutes, it was wonderful. Afterward,
we split up into the barcamp sessions in which I attended.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/slightlyoff/ServiceWorker&quot;&gt;Service Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.w3.org/TR/components-intro/&quot;&gt;Web Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bed Rock – Unearthing Primitives – A crazy awesome wacky idea of using
MessageChannel’s to provide low-level APIs.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/slightlyoff/ServiceWorker&quot;&gt;Packaging on the Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remote Debugging – Source Maps – I bailed out to go listen to
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/mhevery&quot;&gt;Misko Hevery&lt;/a&gt; discuss directive semantics in
Dart with &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/justinfagnani&quot;&gt;Justin Fagnani&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I considered posting my notes about the discussions and topics covered in these
sessions but I think that content is best explored in the meeting minutes found
on the events &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://lanyrd.com/2014/extensible-web-summit/&quot;&gt;lanyrd page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/images/articles/extensible-web-summit/packaging.jpg&quot; alt=&quot;Discussing Web Packaging&quot;/&gt;
&lt;img src=&quot;/assets/images/articles/extensible-web-summit/web-components.jpg&quot; alt=&quot;Web Components&quot;/&gt;
&lt;img src=&quot;/assets/images/articles/extensible-web-summit/drinks.jpg&quot; alt=&quot;Drinks&quot;/&gt;
&lt;img src=&quot;/assets/images/articles/extensible-web-summit/proposing-sessions.jpg&quot; alt=&quot;Discussing Sessions&quot;/&gt;&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Grunt.js Workflow</title><link>https://www.merrickchristensen.com/articles/gruntjs-workflow</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/gruntjs-workflow</guid><description>Completely refactor your workflow with Grunt.js. A task-based command line tool written in JavaScript.</description><pubDate>Fri, 01 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ for irrelevance. Webpack &amp;amp; NPM Scripts
have made Grunt useless to me.&lt;/p&gt;
&lt;p&gt;In this article I’m going to show you how to leverage Grunt.js to completely
refactor your workflow. Follow in the footsteps of some of the most
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/jquery/jquery/commits/master/grunt.js&quot;&gt;prolific open source projects&lt;/a&gt;
in the world and leave the grunt work to Grunt.js.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;what-is-gruntjs&quot;&gt;&lt;a href=&quot;#what-is-gruntjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is Grunt.js?&lt;/h3&gt;
&lt;p&gt;Grunt.js is a fantastic task-based command line tool written in JavaScript on
top of the wonderful Node.js platform. You can leverage Grunt.js to script away
all of your grunt work. Tools and procedures that you historically ran and
configured yourself, you can now abstract behind a convention based command line
interface with a consistent means of configuration. You can write your most
complicated tasks &lt;em&gt;once&lt;/em&gt; and leverage them in all of your projects using project
specific configuration.&lt;/p&gt;
&lt;p&gt;What are these tasks I keep referencing? Well, really thats up to you, but a few
of the most common ones are
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/gruntjs/grunt-contrib-concat&quot;&gt;concatenating files&lt;/a&gt;,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/gruntjs/grunt-contrib-jshint&quot;&gt;linting&lt;/a&gt; and
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/karma-runner/grunt-karma&quot;&gt;testing&lt;/a&gt; your code, and
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/gruntjs/grunt-contrib-uglify&quot;&gt;minification&lt;/a&gt;. Grunt.js
doesn’t limit you to JavaScript specific tasks either, because Grunt.js is built
on top of Node.js you can leverage all the power of Node in your tasks. Even if
your tool isn’t implemented in JavaScript we can defer tasks to child processes,
using their command line interface or even a web service. For example, the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/gruntjs/grunt-contrib-compass&quot;&gt;grunt-contrib-compass&lt;/a&gt; task,
which allows you to compile your SCSS/SASS stylesheets using the excellent
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://compass-style.org/&quot;&gt;Compass framework&lt;/a&gt; (a ruby program), is implemented
using the Compass provided command line interface. The point is that just about
any tool can be abstracted behind a Grunt task.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;why-should-i-use-gruntjs&quot;&gt;&lt;a href=&quot;#why-should-i-use-gruntjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Why should I use Grunt.js?&lt;/h3&gt;
&lt;h4 id=&quot;consistency&quot;&gt;&lt;a href=&quot;#consistency&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Consistency&lt;/h4&gt;
&lt;p&gt;Grunt.js provides a consistent interface for configuring and using any task.&lt;/p&gt;
&lt;h4 id=&quot;utility&quot;&gt;&lt;a href=&quot;#utility&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Utility&lt;/h4&gt;
&lt;p&gt;Grunt.js allows you to run your tasks when monitored files change or manually
using the command line. It also allows you to aggregate tasks using aliases,
this is a very powerful feature which allows you to abstract the details of a
more generic task. For example, one might abstract linting, testing,
concatenating, and minification behind a task named “build”.&lt;/p&gt;
&lt;h4 id=&quot;community&quot;&gt;&lt;a href=&quot;#community&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Community&lt;/h4&gt;
&lt;p&gt;Grunt.js has a strong and rapidly growing community. The barrier to entry for
using and customizing Grunt is so minimal that there is already a whole bunch
great tasks available for use today. Take a look at the bountiful
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://gruntjs.com/plugins&quot;&gt;plugin landscape&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;power-and-flexibility&quot;&gt;&lt;a href=&quot;#power-and-flexibility&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Power &amp;amp; Flexibility&lt;/h4&gt;
&lt;p&gt;Grunt.js provides all the power of Node.js for your tasks. It also provides some
very fundamental and powerful abstractions for common needs, like working with
the file system or logging to the standard out (stdout).&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;who-is-using-it&quot;&gt;&lt;a href=&quot;#who-is-using-it&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Who is using it?&lt;/h3&gt;
&lt;p&gt;Lots of excellent projects are leveraging Grunt.js. To name a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/angular/angular.js/commits/master/Gruntfile.js&quot;&gt;angular.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/jquery/jquery/commits/master/grunt.js&quot;&gt;jQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/search?q=grunt.js&quot;&gt;Many, many, many more…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;a-gruntjs-workflow&quot;&gt;&lt;a href=&quot;#a-gruntjs-workflow&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Grunt.js Workflow&lt;/h3&gt;
&lt;p&gt;The project structure we are going to use in this example is straight forward.
We have a folder called “src”, which has our application’s source code and a
folder called “test” that has our application’s test. This is a Mocha driven
test suite.&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;img src=&quot;/assets/images/articles/gruntjs-workflow/file-system-pre-grunt.png&quot; alt=&quot;Before Grunt.js File System&quot; title=&quot;Before Grunt.js File System&quot;/&gt;&lt;figcaption&gt;Before Grunt.js File System&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;First things first, lets get Grunt installed and integrated into the project so
we can start adding useful tasks.&lt;/p&gt;
&lt;h4 id=&quot;installation&quot;&gt;&lt;a href=&quot;#installation&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Installation&lt;/h4&gt;
&lt;p&gt;Lets install the Grunt CLI globally so we can access the “grunt” command. To
install Grunt run the following command. I assume you already have
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; installed. The job of the grunt command is to load
and run the version of Grunt you have installed locally to your project,
irrespective of its version. If you have some projects using Grunt 0.4 and
others using Grunt 0.3, the grunt-cli will select and run the proper grunt
installation.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cli&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;g&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can check and make sure Grunt is installed correctly by asking the program
for it’s version.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;project-integration&quot;&gt;&lt;a href=&quot;#project-integration&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Project Integration&lt;/h4&gt;
&lt;p&gt;Time to integrate Grunt with our project. First lets create a package.json file
so we can quickly track and install our applications dependencies. What
dependencies? Well, we will need to add Grunt.js as one. Soon we will add our
third party Grunt tasks here too!&lt;/p&gt;
&lt;p&gt;Having a package.json file is not required to use Grunt, however it makes
managing our third party tasks a lot easier! You will see what I mean in a
little bit. For now, we can create a package.json at the root of our project
with the following contents.&lt;/p&gt;
&lt;h5 id=&quot;packagejson&quot;&gt;&lt;a href=&quot;#packagejson&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;package.json&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Example&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;0.0.1&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;devDependencies&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;latest&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you already have a package.json file and you want to add Grunt to your
project. You can do that by running the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;cli&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Terrific now it is time to create our Gruntfile! A Gruntfile is a JavaScript
file that Grunt leverages to understand your projects tasks and configuration.
When you run “grunt” from the command line, Grunt will recurse upwards till it
finds your Gruntfile. This functionality allows you to run Grunt from any sub
directory of your project.&lt;/p&gt;
&lt;h5 id=&quot;gruntfilejs&quot;&gt;&lt;a href=&quot;#gruntfilejs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Gruntfile.js&lt;/h5&gt;
&lt;p&gt;This is the basis of a Grunt file, it’s a wrapper function that takes in “grunt”
as an argument. This allows us to register tasks and configuration with grunt
(and leverage Grunt’s APIs) before Grunt actually runs any tasks. Think of this
as an entry point of sorts for Grunt.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// set up grunt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Well done, you now have Grunt installed. Go ahead, and run “grunt” from your
command line at the root of your project. You will see a warning that it can’t
find a default task. Very well then, lets go about adding some tasks!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Warning&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;not&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;found&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Use&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;force&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Aborted&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;due&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;warnings&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;automate-the-grunt-work&quot;&gt;&lt;a href=&quot;#automate-the-grunt-work&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Automate The Grunt Work&lt;/h4&gt;
&lt;p&gt;Wouldn’t it be great if we could run our JavaScript code through JSHint and get
all sorts of great feedback on making our code more consistent and less buggy?
Fortunately, Grunt has a few common tasks built right in, code linting with
JSHint is one of them. Lets modify our Gruntfile to get this working!&lt;/p&gt;
&lt;h5 id=&quot;gruntfilejs&quot;&gt;&lt;a href=&quot;#gruntfilejs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Gruntfile.js&lt;/h5&gt;
&lt;p&gt;First install the JSHint task by running this command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;contrib&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/*global module:false*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Gruntfile.js&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;src/app/**/*.js&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;src/config.js&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;tests/app/**/*.js&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;curly&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eqeqeq&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;immed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;latedef&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;newcap&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;noarg&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;undef&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;boss&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;eqnull&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;globals&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;requirejs&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Load JSHint task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;loadNpmTasks&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;grunt-contrib-jshint&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Default task.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;registerTask&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here we install and configure the “jshint” task telling it which files to lint
using &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/isaacs/minimatch&quot;&gt;minimatch&lt;/a&gt; style globbing. We also
configure &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.jshint.com/&quot;&gt;JSHint&lt;/a&gt; to our liking, adding globals that
are ok and making sure it only complains when we violate our decided coding
standards. We then create an alias called “default”, and we tell it to run the
“jshint” task.&lt;/p&gt;
&lt;p&gt;Go ahead and run grunt again…&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint:src&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Lint&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;free&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;without&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can also run the jshint task directly!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint:src&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Lint&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;free&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;without&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wouldn’t it be great if we could lint our code automatically every time one of
our linted files changes? Thats easy enough thanks to the grunt “watch” task.
Let’s install and add some “watch” configuration to your grunt.initConfig call.&lt;/p&gt;
&lt;p&gt;First we install it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;contrib&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we configure and load it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;files&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;lt;%= jshint.src %&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;loadNpmTasks&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;grunt-contrib-watch&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tells the grunt “watch” task (a built in task), to run the “lint” task
every time one of the configuration specified lint files changes! The sharp
reader will notice the use of
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://lodash.com/docs#template&quot;&gt;lodash templates&lt;/a&gt; to reference the “lint”
configuration from “watch”.&lt;/p&gt;
&lt;p&gt;While code linting is a great tool to try an manage code quality it hardly
provides the confidence we need to ship our application to production. Lets set
up Grunt to run our &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://visionmedia.github.com/mocha/&quot;&gt;Mocha&lt;/a&gt; specs in
PhantomJS, that should give us a bit more confidence before shipping.&lt;/p&gt;
&lt;p&gt;Before we set out to write our own Grunt task for Mocha, lets check NPM and make
sure nobody else has implemented one already.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;gruntplugin&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;                 &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;DESCRIPTION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;          &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;specs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;side&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;tests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;simple&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;simple&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;wrapper&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;tests&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Mocha&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;istanbul&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;specs&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;writing&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;istanbul&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What do you know!? Looks like someone has already created a Grunt task to run
Mocha specs! Lets go ahead and leverage it!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;D&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command installs &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/kmiyashiro/grunt-mocha&quot;&gt;grunt-mocha&lt;/a&gt;
and saves it as a development dependency in our package.json. This is useful
when someone else clones our repository; instead of tracing down our
dependencies manually, they can simply run “npm install” and NPM will download
the correct version of &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/kmiyashiro/grunt-mocha&quot;&gt;grunt-mocha&lt;/a&gt;
for them!&lt;/p&gt;
&lt;p&gt;Now that grunt-mocha is installed we need to load it into our project using the
grunt.loadNpmTasks method, which allows us to load in grunt tasks from NPM
installed dependencies.&lt;/p&gt;
&lt;h5 id=&quot;gruntjs&quot;&gt;&lt;a href=&quot;#gruntjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;grunt.js&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;modules&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;…&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;loadNpmTasks&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;grunt-mocha&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that Grunt is loading in grunt-mocha, lets configure it to run our tests.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;tests/index.html&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The tests/index.html file is a basic Mocha test runner, much like the one you
see if you run “mocha init” from the command line. Now we can execute our mocha
tests in PhantomJS from Grunt.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;mocha:all&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Testing&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;assertions&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;passed&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;04s&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty cool, eh? With, 3 lines of configuration and a method call we are running
our tests in PhantomJS. Lets add the mocha task to our watch command so each
time a linted file changes we execute our tests as well as lint our code.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;files&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when we execute “grunt watch” and change a file we get immediate feedback on
our tests and code quality.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;watch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Waiting&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Gruntfile.js&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;renamed&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint:src&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Lint&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;free&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;mocha:all&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Testing&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;assertions&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;passed&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;04s&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty sweet, huh!?&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;custom-tasks&quot;&gt;&lt;a href=&quot;#custom-tasks&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Custom Tasks&lt;/h3&gt;
&lt;p&gt;Obviously Grunt.js isn’t limited to code quality tasks. To demonstrate how
generic a Grunt.js task can be lets write a custom task to compliment us every
time we run grunt.&lt;/p&gt;
&lt;p&gt;Lets start out by registering a task called “compliment”.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;exports&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;registerTask&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;You are so awesome!&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With a call to register task, and simple call back function we have a custom
Grunt task. We can run it from the command line directly just like we ran lint
or mocha.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;compliment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;You&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;so&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;awesome&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;without&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Well, thank you Grunt. I think you are awesome too.&lt;/p&gt;
&lt;p&gt;Wouldn’t it be great if users could customize their compliments using their
grunt configuration and have a random compliment each time? Simple enough…&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;//...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;You are so awesome!&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;You remind me of Brad Pitt, only you have a better body.&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;You are a funny, funny kid.&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;registerTask&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Treat yo&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt; self!&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;No one cares to customize me.&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Notice we use the grunt object to retrieve configuration.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;compliments&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;compliments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;writeln&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;compliments&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Observant readers will note that I added a description argument, this is used
when consumers run grunt -h…&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Treat&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;yo&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt; self!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We pull the compliment array out of the configuration using the grunt.config
function, we then select a random compliment and echo it to the user. Lets add
this to our default just before lint and test.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;registerTask&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when we run “grunt” we get a fresh compliment. My day is already starting to
look up.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;grunt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;compliment&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;You&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;funny&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;funny&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;kid&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;jshint:src&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jshint&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Lint&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;free&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Running&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;mocha:all&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;mocha&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Testing&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;assertions&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;passed&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;04s&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;without&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you are interested in writing Grunt tasks others can use, see
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/iammerrick/grunt-compliment&quot;&gt;grunt-compliment&lt;/a&gt; where I
refactored this “compliment” task and published it NPM.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;wrapping-it-up&quot;&gt;&lt;a href=&quot;#wrapping-it-up&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Wrapping it up…&lt;/h3&gt;
&lt;p&gt;Grunt is a powerful tool and I’ve only scratched the surface in this article.
Try to leverage it in your next project and if it doesn’t completely refactor
your workflow &lt;a href=&quot;/follow&quot;&gt;reach out&lt;/a&gt; and tell me why.
Leave the grunt work to Grunt.js so your mind and time can be liberated for the
hard problems.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Scenario vs. Problem Solving</title><link>https://www.merrickchristensen.com/articles/scenario-vs-problem-solving</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/scenario-vs-problem-solving</guid><description>Scenario solving versus problem solving and its consequences for the artifact produced.</description><pubDate>Sun, 25 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h3 class=&quot;top-level&quot; id=&quot;what-is-scenario-solving&quot;&gt;&lt;a href=&quot;#what-is-scenario-solving&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is Scenario Solving?&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;A&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;&lt;/span&gt; scenario is typically just one narrow manifestation of a much broader problem.
Scenario solving is taking one narrow segment of a problem and solving it
without considering the scope or context of the problem itself.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;what-is-problem-solving&quot;&gt;&lt;a href=&quot;#what-is-problem-solving&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is Problem Solving?&lt;/h3&gt;
&lt;p&gt;Problem-solving is considering the entire scope of the problem and implementing
a solution. A problem can be thought of as an aggregate of scenarios, the
solution to which resolves the majority of the problem’s scenarios. A scenario
is typically just one manifestation of a much more general problem.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;the-difference&quot;&gt;&lt;a href=&quot;#the-difference&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Difference&lt;/h3&gt;
&lt;p&gt;Scenario solving results in a fragmented user experience. While problem-solving
results in useful primitives that can be composed to build features
significantly faster and more efficiently.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Angular Cheat Sheet</title><link>https://www.merrickchristensen.com/articles/angular-cheat-sheet</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/angular-cheat-sheet</guid><description>The arcane bits of Angular in the form of a simple cheat sheet.</description><pubDate>Sat, 18 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h4 class=&quot;top-level&quot; id=&quot;update-august-11-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-august-11-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update August 11, 2018 – Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ because I’ve not ensured its relevance
with the latest in Angular.js. I brought it back by
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://twitter.com/ghettosoak/status/1027118531131916289&quot;&gt;request&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2&gt;Directives&lt;/h2&gt;
&lt;h3&gt;Restrict&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Character&lt;/th&gt;
    &lt;th&gt;Declaration Style&lt;/th&gt;
    &lt;th&gt;Example&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tr&gt;
  &lt;td&gt;E&lt;/td&gt;
  &lt;td&gt;element&lt;/td&gt;
  &lt;td&gt;&amp;lt;hello to=&quot;world&quot;&amp;gt;&amp;lt;/hello&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;A&lt;/td&gt;
  &lt;td&gt;attribute&lt;/td&gt;
  &lt;td&gt;&amp;lt;div hello=&quot;world&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;C&lt;/td&gt;
  &lt;td&gt;class&lt;/td&gt;
  &lt;td&gt;&amp;lt;div class=&quot;hello:world&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;M&lt;/td&gt;
  &lt;td&gt;comment&lt;/td&gt;
  &lt;td&gt;&amp;lt;!--directive:hello World --&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;Scope&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Scope Type&lt;/th&gt;
    &lt;th&gt;Syntax&lt;/th&gt;
    &lt;th&gt;Description&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tr&gt;
  &lt;td&gt;existing scope&lt;/td&gt;
  &lt;td&gt;scope: false (default)&lt;/td&gt;
  &lt;td&gt;The existing scope for the directive&apos;s DOM element.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;new scope&lt;/td&gt;
  &lt;td&gt;scope: true&lt;/td&gt;
  &lt;td&gt;A new scope that inherits from your enclosing controller&apos;s scope prototypically. This scope will be shared with any other directive on your DOM element that request this kind of scope and can be used to communicate with them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;isolate scope&lt;/td&gt;
  &lt;td&gt;scope: { attributeName: &apos;BINDING_STRATEGY&apos; } or { attributeAlias: &apos;BINDING_STRATEGY&apos; + &apos;attributeName&apos; }&lt;/td&gt;
  &lt;td&gt;An isolate scope that inherits no properties from the parent, you can however access the parent scope using $parent.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;Scope Binding Strategies&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Symbol&lt;/th&gt;
    &lt;th&gt;Meaning&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tr&gt;
  &lt;td&gt;@&lt;/td&gt;
  &lt;td&gt;
    Pass this attribute as a string. You can bind values to the parent scope
    using {{ interpolation }}.
  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;=&lt;/td&gt;
  &lt;td&gt;Data bind this property to the directive&apos;s parent scope.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;amp;&lt;/td&gt;
  &lt;td&gt;
    Pass in a function from the parent scope to be called later. Used to pass
    around lazily evaluated angular expressions.
  &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;Require&lt;/h3&gt;

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Option&lt;/th&gt;
    &lt;th&gt;Usage&lt;/th&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tr&gt;
  &lt;td&gt;directiveName&lt;/td&gt;
  &lt;td&gt;A camel-cased name that specifies which directive teh controller should come from. If our &lt;dialog-title&gt; directive needs to find a controller on it&apos;s parent &lt;dialog&gt; we would write &quot;dialog&quot;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;^&lt;/td&gt;
  &lt;td&gt;By default, Angular gets the controller from the named directive on the same element. Adding this symbol says to walk up the DOM to find the directiev. For the dialog example with would need to add this symbol &quot;^dialog&quot;. This means, look up till you find the parent dialog directive and give me that controller.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;?&lt;/td&gt;
  &lt;td&gt;Makes the required controller optional, otherwise Angular would throw an exception if it couldn&apos;t find it.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Source Modification With r.js</title><link>https://www.merrickchristensen.com/articles/build-angular-with-requirejs</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/build-angular-with-requirejs</guid><description>An overview of source modification with r.js. Using ngmin and Angular.js as an example.</description><pubDate>Fri, 10 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 – Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ for irrelevance. I have migrated from
r.js to Webpack.&lt;/p&gt;
&lt;p&gt;One of the great principles of &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://requirejs.org/&quot;&gt;Require.js&lt;/a&gt; is that you
shouldn’t need a build step during development, you should simply be able to
refresh the browser and see your changes reflected. This does not mean, however,
that you should also have to compromise on performance. Often times it makes
sense to modify your application’s source at build time for performance reasons.
This includes minification, annotation, inlining of text dependencies, or even
transpiling one source format to another. Require.js offers the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://requirejs.org/docs/optimization.html&quot;&gt;r.js&lt;/a&gt; build tool to optimize your
code for production as well as a robust plugin system. This article will focus
on the former, using
&lt;a href=&quot;/articles/javascript-dependency-injection&quot;&gt;Angular.js dependency injection annotations&lt;/a&gt;
and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/btford/ngmin&quot;&gt;ngmin&lt;/a&gt; as an example.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;the-problem&quot;&gt;&lt;a href=&quot;#the-problem&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Problem&lt;/h3&gt;
&lt;p&gt;In Angular.js a dependency injection system is used to resolve dependencies and
provide them at run time. Dependencies use constructor function argument names
to match dependencies and provide them at run time. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;angular&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;people&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;MyCtrl&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// $scope and $http were resolved by name and provided here.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Please see the
&lt;a href=&quot;/articles/javascript-dependency-injection&quot;&gt;JavaScript Dependency Injection&lt;/a&gt;
article for a more detailed explanation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This approach becomes problematic at the minification phase of a project because
when the argument names are mangled they can no longer be properly mapped to
dependencies.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;angular&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;people&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;MyCtrl&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// WTF is a or b?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the above reason Angular.js provides a build safe approach for declaring
dependencies which involves using strings to annotate dependencies.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;angular&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;people&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;MyCtrl&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Ok so a is $scope and b is $http.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This certainly works and is more akin to how we declare AMD dependencies, but
doing these annotations means we duplicate our dependency declarations once in
the array annotations and again in the function arguments. Worse, since we don’t
have the ability to use something like the excellent
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://requirejs.org/docs/whyamd.html#sugar&quot;&gt;CommonJS sugar&lt;/a&gt; Require.js
provides, we are forced to maintain two disparate lists of dependencies and
match them up using order instead of variable declarations.&lt;/p&gt;
&lt;p&gt;Wouldn’t it be great if we could use a tool to perform these annotations for us?
Enter &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/btford/ngmin&quot;&gt;ngmin&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;ngmin&quot;&gt;&lt;a href=&quot;#ngmin&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;ngmin&lt;/h4&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/btford/ngmin&quot;&gt;ngmin&lt;/a&gt; is a preprocessor which parses your
code for injectable constructor functions and annotates them automatically
making your Angular.js code “build safe”.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;ngmin&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;somefile&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;somefile&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command would output “somefile.annotate.js” which would be an annotated
version of some file.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a side note, ngmin also offers a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/btford/grunt-ngmin&quot;&gt;grunt task&lt;/a&gt; and a
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://rubygems.org/gems/ngmin-rails&quot;&gt;Rails Asset Pipeline plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using ngmin is well and good and all but we now have an additional step of added
complexity for every build we perform. A developer needs to run a concatenator
(or dependency tracer), ngmin, and then the minifier. All of this before or
after other application specific build tools. To make things worse order matters
in many of these cases so running different tasks in parallel becomes difficult.&lt;/p&gt;
&lt;p&gt;Enter &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://requirejs.org/docs/optimization.html&quot;&gt;r.js&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;rjs&quot;&gt;&lt;a href=&quot;#rjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;r.js&lt;/h4&gt;
&lt;p&gt;r.js is the defacto build tool for AMD driven projects and thanks to its
extensible callbacks we can perform source modification using things like ngmin.
This way developers will run “r.js” causing concatenation, annotation and
minification to be taken care of by a single system. This helps reduce
complexity in a build system by decreasing the number of cognitive steps to one
instead of three.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;solution&quot;&gt;&lt;a href=&quot;#solution&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Solution&lt;/h3&gt;
&lt;p&gt;r.js offers an excellent build hook “onBuildRead” which is invoked for each
module, the return value of this hook will be used for the built file prior to
minification. For performance reasons r.js will only invoke this on your bundled
modules by default. I recommend setting “normalizeDirDefines” to “all” which
means these modifications will be run on all files, not just your bundled
modules. The reason I make this recommendation is because I believe you should
run your unit tests after the build process and since unit tests are executed
against individual modules you will need your source modifications to run
against those as well. It is important to remember that tools like UglifyJS,
r.js or ngmin aren’t flawless.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;javascripts-built&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;baseUrl&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;javascripts&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;modules&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;MyApplication&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;normalizeDirDefines&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;onBuildRead&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;moduleName&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;contents&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;ngmin&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;contents&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now all of “MyApplication” and its child modules will be run through ngmin, and
minified afterwards. This means we can unit test those children as well. The
combination of “onBuildRead” and “normalizeDirDefines” empowers us to perform
testable source modification at build time.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>MV* Frameworks and Libraries</title><link>https://www.merrickchristensen.com/articles/mvstar-libraries-and-frameworks</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/mvstar-libraries-and-frameworks</guid><description>JavaScript can get messy quickly, we tame this spaghetti monster using libraries and frameworks that implement battle tested design patterns for more structure and maintainability.</description><pubDate>Sun, 25 Nov 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ because I’ve since moved to different
paradigms completely such as &lt;a href=&quot;/articles/single-state-tree&quot;&gt;Single State Atom&lt;/a&gt;,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt; &amp;amp; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt;. While MV* was
a dream on the backend it really broke down for me on the client.&lt;/p&gt;
&lt;p&gt;So, we just explored &lt;a href=&quot;/articles/dom-libraries&quot;&gt;DOM Libraries&lt;/a&gt; in
our last article, which do a whole world of good when it comes to abstracting
browser bugs and leveling the playing field. Certainly tools like
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt; are a powerful weapon in our arsenal for conquering
the JavaScript landscape. It can be so powerful, in fact, people can unknowingly
abuse it. Turning innocent interfaces into crimes against animation, and
bludgeoning the separation of concerns with a round house kick to the teeth of
maintainability. Let me show you the problem as it unfolds on so many websites
and applications today, then I will walk you through some of the solutions we
have at our disposal.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;the-dom-the-trap-the-humanity&quot;&gt;&lt;a href=&quot;#the-dom-the-trap-the-humanity&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The DOM! The Trap! The Humanity!&lt;/h3&gt;
&lt;p&gt;A lot of times in our application we have the need for more interesting and
complex user interface components. Historically speaking we often called these
“progressive enhancements”, which in fact they often are. Sometimes they are
less enhancements, but rather requirements for our user interface to make any
sense. When you get a powerful tool like jQuery into your hands your inclination
is to take a boring DOM structure and spice it up with a little jQuery romance.
Let me show you what I mean…&lt;/p&gt;
&lt;h4 id=&quot;fnabuse&quot;&gt;&lt;a href=&quot;#fnabuse&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;$.fn.abuse&lt;/h4&gt;
&lt;p&gt;jQuery has a wonderful plugin system which allows you to add methods to the
jQuery object to provide more functionality to your selected elements. The
trouble is in the lack of discipline and structure developers employ to
construct these plugins. Often times plugins will do so many things all in one
giant callback. Traditional Object Oriented programming patterns are thrown to
the dogs while developers struggle to take a document composed of HTML and make
it something incredible like users are growing to expect.&lt;/p&gt;
&lt;p&gt;Take for example this element, we really want to make it do something cool.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;some-element&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;WTHeck Man?&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So we implement our plugin, whatever it may be.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;abuse&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Set some markup from DOM stored state&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;.title&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Callback from AJAX to see if the user should receive their highfive.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;highFive&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;highfive&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;lt;div&amp;gt;High five holmes!&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Check the time...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Inform the server the time which informs us to highfive or not.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;stupid/request&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;POST&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dataType&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;highFive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we select our element and instantiate our plugin. If you are wondering how
this works, $.fn is simply a pointer to jQuery’s prototype. (If you don’t know
what that means read up on prototypal inheritance.
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/&quot;&gt;This&lt;/a&gt;
is a great article to start with.) And “this” is the element you are calling the
plugin on.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;.some-element&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;abuse&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This approach is riddled with problems. Look at all the different types of work
we did in the context of our abuse plugin. What if we needed to change the way
all of our AJAX responses get processed? Why would the view need to know
anything about the server in the first place? Why does this plugin have the
power to reach outside of it’s own element? What if the server wanted to
schedule the plugin to high five in a few seconds? Should we put all that logic
in our plugin too?&lt;/p&gt;
&lt;p&gt;As with all types of programming separating our concerns is fundamental to
maintainability. This is as true in JavaScript as it is anywhere else, imagine
if the next implementation of your web services included all of your database
queries, logging, routing, cacheing, etc in a single class. Yikes!&lt;/p&gt;
&lt;p&gt;Obviously the $.fn.abuse plugin could be refactored into smaller functions but
that still isn’t enough. Even the jQuery UI project has tools to help write
robust and separated components beyond simple plugins… Look into the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://api.jqueryui.com/jQuery.widget/&quot;&gt;Widget Factory&lt;/a&gt; which provides an
inheritance model and improved structure. It is a serious problem, that grows
with your project. Eventually plugins are fighting over DOM elements and sharing
state, your pre-javascript markup looks nothing like your inspect-able source.
It’s a tearful road travel.&lt;/p&gt;
&lt;p&gt;This is not to say interacting with the document to create nifty new user
interface components is &lt;em&gt;bad&lt;/em&gt;, I am just trying to point out that we need more!
We need a layer to interact with our data, one that can handle validation and
syncing to the server. We need a view that is agnostic to concerns except
presentation. We need a way to keep our views and our models in sync so we can
stop the madness of trying synchronize them ourselves. I am having a difficult
time articulating how and why a project grows unmaintainable when you construct
everything using the DOM. If you’ve worked on a project of any scale odds are
you’re already nodding your head saying, “Oh man, I know about this spaghetti
mess already. You are preaching to the choir son, how do I tame it?”&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;the-structure-the-convention-the-beauty&quot;&gt;&lt;a href=&quot;#the-structure-the-convention-the-beauty&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;The Structure! The Convention! The Beauty!&lt;/h3&gt;
&lt;p&gt;If you haven’t already please review some of the structural patterns
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html&quot;&gt;Model-View-Controller&lt;/a&gt;
and the work done by &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://addyosmani.com/blog&quot;&gt;Addy Osmani&lt;/a&gt;. JavaScript MV*
or Model-View-? frameworks provide much needed structure and convention to web
application development.&lt;/p&gt;
&lt;p&gt;This article is not to explain MVC or other structural patterns. It’s not to
condemn using jQuery or other DOM manipulation libraries either. I am simply
proposing those libraries have a purpose and we should keep them focused on
doing what they do best, DOM manipulation and browser normalization! It is
simply to spread the good news, these patterns fit in the JavaScript landscape
just like they do in C++, Java, Objective-C or any other language! All those
great patterns and principles we learned building native UIs are applicable in
building JavaScript UIs as well! We can take our abuse plugin an make some sense
of it… This example leverages &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://backbonejs.org&quot;&gt;Backbone.js&lt;/a&gt;. Ultimately
we should refactor the DOM construction to a template library, but we will save
that for another article.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Create a model to store our data and application logic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Backbone&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;highfive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;stupid/request&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Create a view to *declaratively* represent our state.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeView&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Backbone&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;change:highfive&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;highFive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;.title&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;$el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;highFive&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;lt;div&amp;gt;High five holmes!&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Instantiate our view.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;SomeView&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;.some-element&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See how we are able to take this horrible example and refactor it so we have a
separation of concerns? SomeView is now responsible for the DOM manipulation,
and State is responsible for all of our data management. There are so many wins
to this kind of approach. Keeping them in sync is a breeze, maintainability and
testability go way up because our code is separated into focused pieces. Reusing
and extending components becomes easy. When leveraging an approach like this,
constructing all of your markup in a browser becomes feasible, even sensible. We
can write and maintain complex user interfaces that provide desktop class
interaction. We can reuse code in new ways because it isn’t coupled to a
particular DOM structure, we can connect our data with different views. We can
do all sorts of great things you didn’t think JavaScript could!&lt;/p&gt;
&lt;p&gt;The JavaScript landscape has a robust collection of libraries for you to pick
from. Almost all of these libraries build on top of existing DOM libraries like
jQuery or work nicely with them. Nearly every one of these libraries provide
some notion of a Model and a View. Though their concepts and approaches are
different they all provide great ideas and tools towards writing more
maintainable web applications.&lt;/p&gt;
&lt;h4 id=&quot;a-summary-of-libraries&quot;&gt;&lt;a href=&quot;#a-summary-of-libraries&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Summary of Libraries&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://backbonejs.org/&quot;&gt;Backbone.js&lt;/a&gt; The most prolific MV* library for
JavaScript, lightweight and un-opinionated. Provides a great starting point
for little cost. There is a large ecosystem of frameworks built on top of
Backbone.js:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://marionettejs.com/&quot;&gt;MarionetteJS&lt;/a&gt; A composite application library for
Backbone.js&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/chaplinjs/chaplin&quot;&gt;Chaplin&lt;/a&gt; An application architecture
for Backbone.js&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://walmartlabs.github.com/thorax/&quot;&gt;Thorax&lt;/a&gt; An opinionated Backbone
application framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://emberjs.com/&quot;&gt;Ember.js&lt;/a&gt; An excellent full featured MVC framework for
creating ambitious web applications.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; An awesome structural framework from
Google providing an end-to-end solution for building web applications.
Beautiful dependency injection and testability.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://canjs.us/&quot;&gt;CanJS&lt;/a&gt; Similar to Backbone.js, formerly known as
JavaScriptMVC.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://knockoutjs.com/&quot;&gt;Knockout&lt;/a&gt; An MVVM framework for JavaScript. Used
heavily by the C# community.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://spinejs.com/&quot;&gt;Spine&lt;/a&gt; Similar to Backbone.js though leans closer
towards MVC, primarily used with CoffeeScript.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://batmanjs.org/&quot;&gt;Batman.js&lt;/a&gt; A full stack framework from Shopify, lots
of useful convention.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://meteor.com/&quot;&gt;Meteor&lt;/a&gt; A promising new platform to construct rich
JavaScript applications. Not exactly an MV* framework but worth a mention.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;a-note&quot;&gt;&lt;a href=&quot;#a-note&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Note&lt;/h4&gt;
&lt;p&gt;There are a plethora of MV* framework for you to pick from.
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://todomvc.com/&quot;&gt;TodoMVC&lt;/a&gt; is a great project to help you select the right
one.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;coming-soon&quot;&gt;&lt;a href=&quot;#coming-soon&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Coming Soon&lt;/h3&gt;
&lt;p&gt;Next we will talk about template libraries, giving us the power to move all our
application logic to client, by constructing our markup in the web browser.
After MV* libraries its the next logical step, right?&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Introducing StyleManager</title><link>https://www.merrickchristensen.com/articles/introducing-stylemanager</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/introducing-stylemanager</guid><description>Manage your styles with JavaScript. A low level tool to manage CSS in the browser. Support for loading StyleSheets as AMD dependencies included.</description><pubDate>Sun, 11 Nov 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ because, while the idea was on point,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/css-modules/css-modules&quot;&gt;CSS Modules&lt;/a&gt; and other modern tools
have displaced it.&lt;/p&gt;
&lt;p&gt;Introducing StyleManager, a JavaScript library to manage styles in the browser.
StyleManager works by creating style tags in the browser and providing an API to
interact with it accordingly. StyleManager is intended to be used as a build
target or leveraged using the provided AMD plugin.&lt;/p&gt;
&lt;p&gt;One of the biggest problems in web application development is CSS. While CSS is
strides ahead of markup driven styles it is still under featured for desktop
class applications. The language is rigid and difficult to maintain. In fact
your only real defense for maintaining CSS properly is a lot of discipline and
perhaps a CSS pre-processor. As an application grows, the separation of your
stylesheets and your features becomes blurry. The trouble is that a great deal
of JavaScript driven components simply don’t work without their corresponding
styles and due to the separation of concerns we still load our stylesheets
entirely separate from their corresponding features. We lazily load features in
JavaScript, but load their styles up front. We specify our JavaScript
dependencies, but not their corresponding stylesheets that are required to
function properly. Why?&lt;/p&gt;
&lt;p&gt;StyleManager aims to empower developers to control that fine line between shared
styles and feature specific styles. It is my contention that feature specific
styles should be loaded just like the feature’s other dependencies. StyleManager
is also a great build target for those who would like to compile their
stylesheets and templates to a JavaScript consumable target.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;get-it&quot;&gt;&lt;a href=&quot;#get-it&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Get It&lt;/h3&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/iammerrick/StyleManager&quot;&gt;StyleManager on Github&lt;/a&gt;&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;an-example&quot;&gt;&lt;a href=&quot;#an-example&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;An Example&lt;/h3&gt;
&lt;p&gt;Below you will find two examples, one using the StyleManager AMD css! plugin and
the other using StyleManager as a build target.&lt;/p&gt;
&lt;h4 id=&quot;amd-plugin&quot;&gt;&lt;a href=&quot;#amd-plugin&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;AMD Plugin&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;css!dialog.css&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;ui/View&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// The contents of dialog.css will be added to the page&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// by the time the module definition function is called&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// you can interact with the stylesheets using the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// styles parameter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;stylemanager-as-a-build-target&quot;&gt;&lt;a href=&quot;#stylemanager-as-a-build-target&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;StyleManager - As a build target.&lt;/h4&gt;
&lt;p&gt;StyleManager is intended to be leveraged as a build target or using the AMD
plugin. You could grab the contents of some-feature.css as it corresponds to
some-feature.handlebars and precompile both accordingly.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;handlebars&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;StyleManager&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Handlebars&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;StyleManager&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;sm&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;StyleManager&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;some-feature.css&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;sm&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;feature&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/*some-feature.css contents*/ .dialog { position: absolute; }&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Handlebars&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;precompile&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/* some-feature.handlebars contents */&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>JavaScript Dependency Injection</title><link>https://www.merrickchristensen.com/articles/javascript-dependency-injection</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/javascript-dependency-injection</guid><description>A quick explanation of how the AngularJS dependency injector works, and how you could write your own simplified JavaScript dependency injection library.</description><pubDate>Wed, 03 Oct 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Inversion_of_control&quot;&gt;Inversion of control&lt;/a&gt; and
more specifically
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://en.wikipedia.org/wiki/Dependency_injection&quot;&gt;dependency injection&lt;/a&gt; have
been growing in popularity in the JavaScript landscape thanks to projects like
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://requirejs.org/&quot;&gt;Require.js&lt;/a&gt; and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt;. This
article is a brief introduction to dependency injection and how it fits into
JavaScript. It will also demystify the elegant way AngularJS implements
dependency injection.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;dependency-injection-in-javascript&quot;&gt;&lt;a href=&quot;#dependency-injection-in-javascript&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Dependency Injection In JavaScript&lt;/h3&gt;
&lt;p&gt;Dependency injection facilitates better testing by allowing us to mock
dependencies in testing environments so that we only test one thing at a time.
It also enables us to write more maintainable code by decoupling our objects
from their implementations.&lt;/p&gt;
&lt;p&gt;With dependency injection, your dependencies are given to your object instead of
your object creating or explicitly referencing them. This means the dependency
injector can provide a different dependency based on the context of the
situation. For example, in your tests, it might pass a fake version of your
services API that doesn’t make requests but returns static objects instead,
while in production it provides the actual services API.&lt;/p&gt;
&lt;p&gt;Another example could be to pass &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://zeptojs.com/&quot;&gt;ZeptoJS&lt;/a&gt; to your view
objects when the device is running &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://www.webkit.org/&quot;&gt;Webkit&lt;/a&gt; instead of
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; to improve performance.&lt;/p&gt;
&lt;p&gt;The main benefits experienced by adopting dependency injection are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Code tends to be more maintainable.&lt;/li&gt;
&lt;li&gt;APIs are more elegant and abstract.&lt;/li&gt;
&lt;li&gt;Code is easier to test.&lt;/li&gt;
&lt;li&gt;The code is more modular and reusable.&lt;/li&gt;
&lt;li&gt;Cures cancer. (Not entirely true.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Holding dependencies to an API based contract becomes a natural process. Coding
to interfaces is nothing new, the server side world has been battle testing this
idea for a long time to the extent that the languages themselves implement the
concept of interfaces. In JavaScript, we have to force ourselves to do this.
Fortunately, dependency injection and module systems are a welcome friend.&lt;/p&gt;
&lt;p&gt;Now that you have some idea of what dependency injection is, let’s take a look
at how to build a simple implementation of a dependency injector using
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://docs.angularjs.org/guide/di&quot;&gt;AngularJS style dependency injection&lt;/a&gt; as a
reference implementation. This implementation is purely for didactic purposes.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;angularjs-style-injection&quot;&gt;&lt;a href=&quot;#angularjs-style-injection&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;AngularJS Style Injection&lt;/h3&gt;
&lt;p&gt;AngularJS is one of the only front-end JavaScript frameworks that fully adopts
dependency injection right down to the core of the framework. To a lot of
developers, the way dependency injection is implemented in AngularJS looks
completely magic.&lt;/p&gt;
&lt;p&gt;When creating controllers in AngularJS, the arguments are dependency names that
will be injected into your controller. The argument names are the key here, they
are leveraged to map a dependency name to an actual dependency. Yeah, the word
“key” was used on purpose, you will see why.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/* Injected */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;WelcomeController&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;/** I want a different Greeter injected dynamically. **/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;basic-requirements&quot;&gt;&lt;a href=&quot;#basic-requirements&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Basic Requirements&lt;/h3&gt;
&lt;p&gt;Let’s explore some of the requirements to make this function work as expected.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The dependency container needs to know that this function wants to be
processed. In the AngularJS world that is done through the Application
object and the declarative HTML bindings. In our world, we will explicitly
ask our injector to process a function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It needs to know what a Greeter before it can inject it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;requirement-1-making-the-injector-aware&quot;&gt;&lt;a href=&quot;#requirement-1-making-the-injector-aware&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Requirement 1: Making the injector aware.&lt;/h4&gt;
&lt;p&gt;To make our dependency injector aware of our WelcomeController we will simply
tell our injector we want a function processed. It’s important to know AngularJS
ultimately does this same thing just using less obvious mechanisms whether that
be the Application object or the HTML declarations.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Time to process&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;WelcomeController&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok, now that the Injector has the opportunity to process the WelcomeController
we can figure out what dependencies the function wants, and execute it with the
proper dependencies. This process is called dependency resolution. Before we can
do that we need a way to register dependencies with our Injector object…&lt;/p&gt;
&lt;h4 id=&quot;requirement-2-registering-dependencies&quot;&gt;&lt;a href=&quot;#requirement-2-registering-dependencies&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Requirement 2: Registering dependencies&lt;/h4&gt;
&lt;p&gt;We need to be able to tell the dependency injector what a &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is before it
can provide one. Any dependency injector worth it’s bits will allow you to
describe &lt;em&gt;how&lt;/em&gt; it is provided. Whether that means being instantiated as a new
object or returning a singleton. Most injection frameworks even have mechanisms
to provide a constructor some configuration and register multiple dependencies
by the same name. Since our dependency injector is just a simplified way to show
how AngularJS does dependency mapping using parameter names, we won’t worry
about any of that.&lt;/p&gt;
&lt;p&gt;Without further excuses, our simple register function:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependency&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependency&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All we do is store our dependency by name so the injector knows what to provide
when certain dependencies are requested. Let’s go ahead and register an
implementation of Greeter.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;RobotGreeter&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Domo Arigato&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;Greeter&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;RobotGreeter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now our injector knows what to provide when &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is specified as a
dependency.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;moving-forward&quot;&gt;&lt;a href=&quot;#moving-forward&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Moving Forward&lt;/h3&gt;
&lt;p&gt;The building blocks are in place it’s time for the sweet part of this article.
The reason I wanted to post this article in the first place, the nutrients, the
punch line, the hook, the call toString() with some sweet reflection. This is
where the magic is, in JavaScript, we don’t have to execute a function
immediately. The trick is to call toString on your function which returns the
function as a string, this gives a chance to preprocess our functions as strings
and turn them back into functions using the Function constructor, or just
execute them with the proper parameters after doing some reflection. The latter
is exactly what we will do here.&lt;/p&gt;
&lt;h4 id=&quot;tostring-returns-winning&quot;&gt;&lt;a href=&quot;#tostring-returns-winning&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;toString Returns Winning&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;WelcomeController&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Returns the function as a string.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;processable&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;WelcomeController&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can try it on your console!&lt;/p&gt;
&lt;figure class=&quot;image&quot;&gt;&lt;img src=&quot;/assets/images/articles/javascript-dependency-injection/processable.png&quot; alt=&quot;Function toString Example&quot; title=&quot;Function toString Example&quot;/&gt;&lt;figcaption&gt;Function toString Example&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Now that we have the WelcomeController as a string we can do some reflection to
figure out which dependencies to inject.&lt;/p&gt;
&lt;h4 id=&quot;dependency-checking&quot;&gt;&lt;a href=&quot;#dependency-checking&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Dependency Checking&lt;/h4&gt;
&lt;p&gt;It’s time to implement the process method of our Injector. First, let’s take a
look at
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/angular/angular.js/blob/master/src/auto/injector.js&quot;&gt;injector.js&lt;/a&gt;
from Angular. You’ll notice the reflection starts on
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L54&quot;&gt;line 54&lt;/a&gt;
and leverages a few regular expressions to parse the function. Let’s take a look
at the regular expression, shall we?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FN_ARGS&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/^function\s*[^\(]*\(\s*([^\)]*)\)/m&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FN_ARGS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; regular expression is used to select everything inside the
parentheses of a function definition. In other words the parameters of a
function. In our case, the dependency list.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;WelcomeController&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FN_ARGS&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Returns Greeter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty neat, right? We have now parsed out the WelcomeController’s dependency
list in our Injector &lt;em&gt;prior&lt;/em&gt; to executing the WelcomeController function!
Suppose the WelcomeController had multiple dependencies, this isn’t terribly
problematic since we can just split the arguments with a comma!&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MultipleDependenciesController&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Greeter&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;OtherDependency&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Implementation of MultipleDependenciesController&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;MultipleDependenciesController&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FN_ARGS&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Returns [&amp;#39;Greeter&amp;#39;, &amp;#39;OtherDependency&amp;#39;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The rest is pretty straightforward, we just grab the requested dependency by
name from our &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependencies&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; cache and call the target function passing the
requested dependencies as arguments. Let’s implement the function that maps our
array of dependency names to their dependencies:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getDependencies&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependencyName&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependencyName&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getDependencies&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; method takes the array of dependency names and maps it to
a corresponding array of actual dependencies. If this map function is foreign to
you check out the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;Array.prototype.map documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now that we have implemented our dependency resolver we can head back over to
our &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;process&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; method and execute the target function with its proper
dependencies.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getDependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty awesome, right?&lt;/p&gt;
&lt;h4 id=&quot;injectorjs&quot;&gt;&lt;a href=&quot;#injectorjs&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Injector.js&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;Injector&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FN_ARGS&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;/^function\s*[^\(]*\(\s*([^\)]*)\)/m&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;FN_ARGS&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--class&quot; style=&quot;color:var(--sh-class)&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getDependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;getDependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependency&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;dependency&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;example-and-excuses&quot;&gt;&lt;a href=&quot;#example-and-excuses&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Example &amp;amp; Excuses&lt;/h4&gt;
&lt;p&gt;You can see the functioning injector we created in this
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://jsfiddle.net/nMK6j/&quot;&gt;example&lt;/a&gt; on jsFiddle.&lt;/p&gt;
&lt;iframe style=&quot;width:100%;height:500&quot; src=&quot;https://jsfiddle.net/nMK6j/1/embedded/&quot; allowFullScreen frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;This contrived example is not something you would use in an actual codebase it
was simply created to demonstrate the rich functionality JavaScript provides and
to explain how AngularJS provides dependency injection. If this interests you I
highly recommend reviewing their code further. It’s important to note this
approach is not novel. Other projects use toString to preprocess code, for
example &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://requirejs.org&quot;&gt;Require.js&lt;/a&gt; uses a similar approach to parse and
transpile CommonJS style modules to AMD style modules.&lt;/p&gt;
&lt;p&gt;I hope you found this article enlightening and continue to explore dependency
injection and how it applies to the client side world.&lt;/p&gt;
&lt;p&gt;I really think there is something special brewing here.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Learn JavaScript - DOM Libraries</title><link>https://www.merrickchristensen.com/articles/dom-libraries</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/dom-libraries</guid><description>Each browser&apos;s DOM is unique. Either use an abstraction layer, or perish.</description><pubDate>Sun, 16 Sep 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h4 id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ for irrelevance. These days evergreen
browsers have drastically improved the situation and we are targeting higher
level abstractions.&lt;/p&gt;
&lt;p&gt;The primary focus of this post is to discuss DOM libraries and why they exist.
To fully answer the question, “What is a DOM library and why do I need one?”, we
will first need to uncover some of JavaScript’s dark and beautiful secrets and
put them out on the table.&lt;/p&gt;
&lt;p&gt;In the land of JavaScript we have many players. All of which implement their
platforms slightly, and in some cases, drastically different than the others.
For example, we have your standard web browsers like Chrome, Firefox, and
Internet Explorer. We also have server platforms such as Node.js and Rhino. We
even have mobile platforms like Boot2Gecko and even more targeted platforms with
the ability to program robots. The most dominant and most used JavaScript
platform is the web browser, but unfortunately even those are not implemented
the same. The sole purpose of most DOM libraries is to mitigate and abstract
these differences so you can program on a consistent interface. In other words,
write your code once and have it work across multiple platforms.&lt;/p&gt;
&lt;p&gt;This problem isn’t new, nearly all developers are familiar with the pain of
supporting multiple platforms. Whether you are leveraging macros in the C
language to compile to OS specific code or using Java for the “comfort” of a
virtual machine, the problem is relatively the same. In JavaScript, it’s no
different.&lt;/p&gt;
&lt;p&gt;We have plenty of platforms to support and despite the great efforts of groups
trying to set standards, differences and bugs still get pushed out into the
market. Innocent consumers use these platforms to the great pain of many
developers who are forced to support them until the offending platform dies.
Rest in pieces IE6. However, out of all the fragmentation and differences that
exists, fewer things have caused more headaches, late nights, and tears than the
Document Object Model (DOM).&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;what-is-the-dom&quot;&gt;&lt;a href=&quot;#what-is-the-dom&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;What is the DOM?&lt;/h3&gt;
&lt;p&gt;“The Document Object Model is an API for HTML and XML documents. It provides a
structural representation of the document, enabling you to modify its content
and visual presentation. Essentially, it connects web pages to scripts or
programming languages.” - Mozilla Developer Network&lt;/p&gt;
&lt;p&gt;The Document Object Model is standardized by the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html&quot;&gt;W3C&lt;/a&gt; and it defines
an interface to abstract HTML and XML documents as objects. The DOM provides us
with a document structure, tree model, Event architecture, DocumentFragments,
Elements and even more process heavy behaviors such as DOM Traversal.&lt;/p&gt;
&lt;p&gt;Hyper Text Markup Language or HTML is the web’s markup language and it is
specified in terms of the DOM. The HTML DOM includes things like the className
property on HTML elements or different APIs like document.body.&lt;/p&gt;
&lt;p&gt;If you would like to learn more about the DOM, I can’t recommend the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/en-US/docs/DOM&quot;&gt;DOM Section&lt;/a&gt; on the
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://developer.mozilla.org/es/&quot;&gt;Mozilla Developer Network&lt;/a&gt; enough.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;so-what-is-the-problem&quot;&gt;&lt;a href=&quot;#so-what-is-the-problem&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;So what is the problem?&lt;/h3&gt;
&lt;p&gt;Remember our talks about fragmentation? Yeah, that applies here. Each browser
has a subtly different implementation of the DOM. Honestly, in some cases, they
aren’t terribly subtle at all. In fact, nearly every DOM method is broken in
some way or another in some browser. Since the DOM is what connects web pages to
programming languages, our program will have to handle all the different use
cases to support each browser.&lt;/p&gt;
&lt;h4 id=&quot;a-example-1-getelementsbytagname&quot;&gt;&lt;a href=&quot;#a-example-1-getelementsbytagname&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Example 1. getElementsByTagName&lt;/h4&gt;
&lt;p&gt;This is a very commonly used DOM method to grab all elements that have a certain
tag name, which is the name of an element. Given an HTML document that looks
like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Name: Merrick&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;sh__token--jsxliterals&quot; style=&quot;color:var(--sh-jsxliterals)&quot;&gt;Height: 6&amp;#39; Tall&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If I call this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--keyword&quot; style=&quot;color:var(--sh-keyword)&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;els&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I now have a collection of &lt;code&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sh__token--entity&quot; style=&quot;color:var(--sh-entity)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; tags selected. Now lets count the number of
elements that have been selected, we use the length property for that.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;els&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Returns 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Works great! Unfortunately, in Internet Explorer the length property will get
overwritten because we have an element in our example above with an
`id=“length”. :(&lt;/p&gt;
&lt;h4 id=&quot;example-2-queryselectorall&quot;&gt;&lt;a href=&quot;#example-2-queryselectorall&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Example 2. querySelectorAll&lt;/h4&gt;
&lt;p&gt;The querySelectorAll method finds DOM elements using CSS selectors.
Unfortunately, the method doesn’t even exist in quirks mode in IE 8 and id
selectors don’t match at all in XML documents.&lt;/p&gt;
&lt;p&gt;These two DOM methods I’ve just shown also happen to be the most popular and
both contain very serious problems when used in different browsers. When working
with other DOM features be prepard to find other obvious inconsistencies
especially with Events and AJAX requests. To solve this problem we need an
abstraction layer. Something our program can talk to that mitigates these issues
and handles the browser specific bugs for us.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;introducing-dom-libraries&quot;&gt;&lt;a href=&quot;#introducing-dom-libraries&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Introducing, DOM Libraries&lt;/h3&gt;
&lt;p&gt;DOM libraries are the solution to this problem. They offer a consistent API to
interact with the DOM that will work cross browser. It’s safe to say that this
comes as a very welcomed relief! Let’s revisit our examples above, by using the
popular library jQuery we can select and output the length across all browsers
with great ease.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--property&quot; style=&quot;color:var(--sh-property)&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;sh__token--string&quot; style=&quot;color:var(--sh-string)&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;sh__token--identifier&quot; style=&quot;color:var(--sh-identifier)&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sh__token--sign&quot; style=&quot;color:var(--sh-sign)&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;sh__token--space&quot; style=&quot;color:var(--sh-space)&quot;&gt; &lt;/span&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;// Returns 2 everywhere!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;sh__line&quot;&gt;&lt;span class=&quot;sh__token--comment&quot; style=&quot;color:var(--sh-comment)&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most DOM libraries typically include abstractions for AJAX requests, DOM
selection, traversal, and manipulation (like CSS and attributes), as well as
event implementations like click.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DOM Libraries are a key tool for fixing cross browser incompatibilities and
bugs.&lt;/em&gt;&lt;/p&gt;
&lt;h4 id=&quot;a-summary-of-libraries&quot;&gt;&lt;a href=&quot;#a-summary-of-libraries&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;A Summary of Libraries&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt; the most popular DOM library, a very safe choice
with a strong community.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://dojotoolkit.org/&quot;&gt;Dojo Toolkit&lt;/a&gt; An excellent well supported library
that offers a lot excellent utility even beyond the DOM.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://yuilibrary.com/&quot;&gt;YUI&lt;/a&gt; Yahoo’s DOM Library&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://prototypejs.org/&quot;&gt;Prototype&lt;/a&gt; One of the founding fathers of the
JavaScript library movement.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://mootools.net/&quot;&gt;MooTools&lt;/a&gt; MooTools is a beautifully designed API
similar to Prototype.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://zeptojs.com/&quot;&gt;Zepto&lt;/a&gt; ZeptoJS is a Webkit specific subset
implementation of the jQuery API. Useful when smaller downloads are
important and you don’t need to support other browsers.&lt;/li&gt;
&lt;li&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://ender.no.de/&quot;&gt;Ender&lt;/a&gt; The idea here is that you compose your own
library from a series of micro libraries with a binding layer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are many, many more DOM libraries to choose from but the important thing
to remember is that they are all trying to solve the same problem, by providing
you with a consistent API for common web development tasks like DOM
manipulation, AJAX requests, and event management that will work cross browser.&lt;/p&gt;
&lt;h3 class=&quot;top-level&quot; id=&quot;moving-forward-mv-frameworks&quot;&gt;&lt;a href=&quot;#moving-forward-mv-frameworks&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Moving Forward - MV* Frameworks&lt;/h3&gt;
&lt;p&gt;Next we will talk about the spaghetti code that can occur when you lean too
heavily on a DOM library like jQuery, and a whole new set of tooling to help
solve that problem. Move on to the next article,
&lt;a href=&quot;/articles/mvstar-libraries-and-frameworks&quot;&gt;MV* Libraries and Frameworks&lt;/a&gt;.&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item><item><title>Learn JavaScript</title><link>https://www.merrickchristensen.com/articles/learn-js</link><guid isPermaLink="true">https://www.merrickchristensen.com/articles/learn-js</guid><description>An introduction to a new series of posts that will attempt to explain the JavaScript landscape.</description><pubDate>Sun, 16 Sep 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h4 class=&quot;top-level&quot; id=&quot;update-june-7-2018-hall-of-shame&quot;&gt;&lt;a href=&quot;#update-june-7-2018-hall-of-shame&quot; class=&quot;anchor&quot;&gt;&lt;/a&gt;Update June 7, 2018 - Hall of Shame&lt;/h4&gt;
&lt;p&gt;&lt;span class=&quot;drop-cap&quot; data-letter=&quot;T&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;opening-words&quot;&gt;his article is&lt;/span&gt; a Hall of Shamer™ for irrelevance.&lt;/p&gt;
&lt;p&gt;Hello there! Hopefully you are here because you want to learn JavaScript. Odds
are you have come here from another language and want to punch all of us
hipsters in the neck for naming our projects after things that do not even sound
vaguely related to what they actually do, you know…
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://backbonejs.org/&quot;&gt;Backbone.js&lt;/a&gt;, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://expressjs.com/&quot;&gt;Express&lt;/a&gt;,
&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://mustache.github.com/&quot;&gt;Mustache&lt;/a&gt;, etc. I imagine diving into JavaScript
with its plethera of transpilers, absurd amount of frameworks, libraries,
awkward language decisions, and multiple environments is a daunting task.&lt;/p&gt;
&lt;p&gt;My aim in this series of posts is to give you an idea of the different types of
problems we face as JavaScript developers, why we have so many libraries and
frameworks, and also give you a brief overview of some of the options that
exists. It is my hope that when this is all over you can walk away with an
understanding of some of the projects you may have already heard of, projects
such as &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;http://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alright that as far as introductions go, thats all I got. Now, head over to the
first post &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;dom-libraries.html&quot;&gt;The DOM Problem&lt;/a&gt;&lt;/p&gt;</content:encoded><dc:creator>Merrick Christensen</dc:creator></item></channel></rss>