<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>John Murray</title>
    <description>&lt; Random thoughts of John Murray</description>
    <link>http://www.johnmurray.io/</link>
    <atom:link href="http://www.johnmurray.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 27 May 2024 16:45:52 +0000</pubDate>
    <lastBuildDate>Mon, 27 May 2024 16:45:52 +0000</lastBuildDate>
    <generator>Jekyll v4.3.3</generator>
    
      <item>
        <title>Bastard Go - Try</title>
        <description>&lt;h3 id=&quot;premise&quot;&gt;Premise&lt;/h3&gt;
&lt;p&gt;Go is great. Scala is great. Scala has &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt;s. Go doesn’t.&lt;/p&gt;

&lt;h3 id=&quot;motivation&quot;&gt;Motivation&lt;/h3&gt;
&lt;p&gt;I’m a horrible person. ¯\_(ツ)_/¯&lt;/p&gt;

&lt;h3 id=&quot;horribleness&quot;&gt;Horribleness&lt;/h3&gt;
&lt;p&gt;In Go it’s typical to return &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;error&lt;/code&gt;s as soon as they happen and handle them locally, or
wrap them with some additional context and pass them back up the stack. In Scala however it’s
idiomatic to wrap an error into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; which represents &lt;em&gt;either&lt;/em&gt; a successfully computed value
or an error. The advantage of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; over a 2-tuple (or multiple return-values) is that the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; can be composed so that you can chain functions together and worry if they failed later,
allowing the error to cascade. An example in Scala might look like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;configLoad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;                   &lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;         &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;???&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getDbConnection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;sql.Connection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;???&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;queryForData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;sql.Connection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;sql.Result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;???&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;transformResults&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;sql.Result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;app.MyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;???&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;app.MyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;configLoad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getDbConnection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;queryForData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;transformResults&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Look how readable that is! &lt;em&gt;Wow….&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Above are several functions, meant to be called in order. Each function returns a possible
error and the next function takes the success value of the previous function. The code starting
with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;for {&lt;/code&gt; is some syntactic sugar (mmmmmm sugar) that allows us to call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatMap&lt;/code&gt;
which are essentially ways of calling the next function assuming the previous one succeeded.
If there was an error, then the value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;model&lt;/code&gt; will be a failed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Failure&lt;/code&gt; in Scala)
with the error.&lt;/p&gt;

&lt;p&gt;This allows the programmer to write code that describes the “happy path”, dealing with errors
at the last possible moment (just like real life).  Some would argue this style is more
readable (if at least not more relatable). ¯\_(ツ)_/¯&lt;/p&gt;

&lt;p&gt;To be fair, this programming style has it’s own
pattern named after trains and if that isn’t enough to convince you, then I think there are larger
issues at play. Go read this two-part post, it’s super good so you should read it without me
prompting you anyways: &lt;a href=&quot;https://fsharpforfunandprofit.com/rop/&quot;&gt;part-1&lt;/a&gt;, &lt;a href=&quot;https://fsharpforfunandprofit.com/posts/recipe-part2/&quot;&gt;part-2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I don’t want this to turn into an in-depth explanation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; in Scala, so go read the
&lt;a href=&quot;https://www.scala-lang.org/api/current/scala/util/Try.html&quot;&gt;docs here&lt;/a&gt; if you still want to know more.&lt;/p&gt;

&lt;h3 id=&quot;continued-horribleness&quot;&gt;Continued Horribleness&lt;/h3&gt;

&lt;p&gt;Let’s make a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; in Go.&lt;/p&gt;

&lt;p&gt;Since we don’t have generics let’s (for now) just use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;interface {}&lt;/code&gt; as the value contained
within our Try.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;   &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;     &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Pretty self-explanatory. Also note that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;success&lt;/code&gt; is used instead of checking for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nil&lt;/code&gt; on
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;success&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;err&lt;/code&gt; because it’s more explicit’ish.&lt;/p&gt;

&lt;p&gt;Next a utility function.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Now we can wrap other functions that produce value/err results. Such as:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;someCheck&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;biscuits&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;You failed the all-important check&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// use result as Try&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;So we got a basic container, but that’s more or less useless. Especially given that there
are no publicly exported fields in our struct and no functions except our utility function
to create/use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt;. Let’s define some basic functions for creating and interacting with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;c&quot;&gt;// NewSuccess creates a new succeeded Try&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;you do not know what you are doing&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// totally right thing to do&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GetFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;you do not know what you are doing&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// totally right thing to do&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This is good, but not entirely usable. As it stands this is just as &lt;em&gt;wonderful&lt;/em&gt; as the
existing Go model of checking errors right at the source. We need some way for the errors
to cascade and for us to say what we &lt;em&gt;want&lt;/em&gt; to do without having to worry about so much
error handling. For this we have to break out the big guns (pew pew), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatMap&lt;/code&gt;.
If you haven’t heard of these functions yet, maybe go try googling “higher order functions”
to get a better idea. I’ll avoid explaining them here since that could be a whole other post
on it’s own.&lt;/p&gt;

&lt;p&gt;Let’s take a stab at this:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FlatMap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FlatMapWrap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;So now with this, we can attempt to chain some stuff together, with all the wonderfulness
that is working with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;interface {}&lt;/code&gt; which is obviously the superior way of writing code in
Go:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;          &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt;            &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ToTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FlatMapWrap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FlatMap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;I mean, can you not see the benefit of this yet? Who would not choose this highly readable, soooper
maintainable code over immediate error checking? It’s always best to avoid your problems as long
as possible (&lt;a href=&quot;https://www.reddit.com/r/LifeProTips/&quot;&gt;LPT&lt;/a&gt;).&lt;/p&gt;

&lt;h3 id=&quot;less-horrible&quot;&gt;Less Horrible?&lt;/h3&gt;

&lt;p&gt;Even though so far we have a working &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; complete with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;interface {}&lt;/code&gt; everywhere (a favorite
style of &lt;em&gt;“real programmers”&lt;/em&gt;), the benevolent overlords of Go built us &lt;a href=&quot;https://blog.golang.org/generate&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go generate&lt;/code&gt;&lt;/a&gt;
and it would be a shame to not find a way to shove that into this blog post.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/cheekybits/genny&quot;&gt;genny&lt;/a&gt;, onwards and upwards my friends!&lt;/p&gt;

&lt;p&gt;First a template without any of the transformation functions (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Map&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FlatMap&lt;/code&gt;, etc):&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;try&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;github.com/cheekybits/genny/generic&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;generic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;     &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewTypeSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewTypeFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IsFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;you do not know what you are doing&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GetFailure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nb&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;you do not know what you are doing&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;With this + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;genny&lt;/code&gt;, we can generate some basic &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; code for a specific type without any composition
functions (we’ll get there). To get the basic support we’d simply run:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# inside the root of your project&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; try
genny &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; try_base.go.tmp &lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt; try/int_base.go gen &lt;span class=&quot;s2&quot;&gt;&quot;Type=int&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And you can now write code like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntTry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewIntSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Of course, without being able to compose things with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt;s of other types, this isn’t that great. So let’s
make a template that allows us to map from one type to another:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;try&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;github.com/cheekybits/genny/generic&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FromType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;generic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;generic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Type&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FromTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MapToToType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FromType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FromTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FlatMapToToType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FromType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FromTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FlatMapWrapToToType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FromType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ToToTypeTry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;With this I can replace our original &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;genny&lt;/code&gt; command with these two:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;genny &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; try_base.go.tmp    &lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt; try/try_base.go    gen &lt;span class=&quot;s2&quot;&gt;&quot;Type=string,int&quot;&lt;/span&gt;
genny &lt;span class=&quot;nt&quot;&gt;-in&lt;/span&gt; try_compose.go.tmp &lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt; try/try_compose.go gen &lt;span class=&quot;s2&quot;&gt;&quot;FromType=string,int ToType=string,int&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And now I have two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try&lt;/code&gt; types, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IntTry&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StringTry&lt;/code&gt; and can seamlessly convert back and forth
like so:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;composedValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NewStringSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;37&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;FlatMapWrapToInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strconv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Atoi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;MapToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Parsed to: %d&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;composedValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;composedValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GetValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;\o/ Yay! This is all very horrible, but it actually works in a usable way. Feel free to spread the &lt;em&gt;love&lt;/em&gt; ;-)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/johnmurray/bastard-go/&quot;&gt;github.com/johnmurray/bastard-go/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;ps&quot;&gt;PS&lt;/h3&gt;

&lt;p&gt;If you made it all the way to the end and didn’t realize this was written with intentional sarcasm… ¯\_(ツ)_/¯&lt;/p&gt;

</description>
        <pubDate>Mon, 27 Nov 2017 00:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2017/11/27/Go-Try.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2017/11/27/Go-Try.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>The Futures Abstraction</title>
        <description>&lt;p&gt;&lt;img src=&quot;data:image/jpeg;base64, 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&quot; alt=&quot;Future! Credit: https://goo.gl/1oDBfh&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Concurrency has many different abstractions: There are the classic
&lt;a href=&quot;https://en.wikipedia.org/wiki/Process_(computing)&quot;&gt;processes&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Thread_(computing)&quot;&gt;threads&lt;/a&gt;, the older but newly-new
&lt;a href=&quot;https://en.wikipedia.org/wiki/Actor_model&quot;&gt;actor-based concurrency&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Communicating_sequential_processes&quot;&gt;CSP style concurrency&lt;/a&gt; (looking at you Go),
and the quite popular future/promise. There are more, but one thing they all have in common
is the goal to create a better way to achieve concurrent computation. This is great, if we understand
what we’re abstracting.&lt;/p&gt;

&lt;p&gt;When it comes to futures, there are a great number of articles online about how to get started using a
particular implementation/framework for futures. However there is a much smaller number of articles
that properly explain what a future is, how they work, and what exactly the abstraction provides you.
This article will walk through those details by implementing futures from the ground-up.&lt;/p&gt;

&lt;p&gt;Before we jump right into code, what is the definition of &lt;em&gt;future&lt;/em&gt;? From &lt;a href=&quot;https://en.wikipedia.org/wiki/Futures_and_promises&quot;&gt;Wikipedia&lt;/a&gt; we get:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… future, promise, delay, and deferred refer to constructs used for synchronizing program execution
in some concurrent programming languages. They describe an object that acts as a proxy for a result that
is initially unknown, usually because the computation of its value is yet incomplete.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A future represents the result of some computation, which will eventually yield a result. The “eventually”
bit typically implies that there is some computation that is executing asynchronously (in another
thread, for example) but can also imply a deferred value. You can think of a deferred value as a lazy
value that is not computed until needed. For this article, we will assume that a future is the result
of an async computation. Note that different implementations may use the names “future,” “promise,”
and “deferred” interchangeably and may differ from this post.&lt;/p&gt;

&lt;p&gt;Great! Now that we understand what a future is, let’s build our abstraction from the ground-up.&lt;/p&gt;

&lt;h2 id=&quot;the-tools&quot;&gt;The Tools&lt;/h2&gt;

&lt;p&gt;For this post we’ll be using &lt;a href=&quot;https://en.wikipedia.org/wiki/Communicating_sequential_processes&quot;&gt;Scala&lt;/a&gt; without any any additional libraries and will only be utilizing
threads for our concurrency. We’ll also make use of some data-structures for sharing values
between threads. Even though I am using Scala, I will avoid any advanced syntax so those unfamiliar
can still (hopefully) follow along.&lt;/p&gt;

&lt;h2 id=&quot;part-1---concurrent-computations&quot;&gt;Part 1 - Concurrent Computations&lt;/h2&gt;

&lt;p&gt;Before we can get into the meat of our abstraction, we need to at least be able to execute some code
concurrently, which can be done simply with threads. Using a new thread for each computation looks like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;concurrentComputation&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;I&apos;m running concurrently! whoop!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;concurrentComputation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This is fairly simple, but some things are worth pointing out.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Unit&lt;/code&gt; means that we didn’t return a value (similar to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;void&lt;/code&gt; in other languages).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Thread&lt;/code&gt; object does not start executing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;run&lt;/code&gt; function until we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;start()&lt;/code&gt; on line 7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite its simplicity, this is a lot of code to type for each block of code we want to run concurrently.
Let’s rewrite this as a function that we can pass a block of code into. For this article, all code
will live in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;simple.future&lt;/code&gt; namespace.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;concurrentComputation&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;concurrentComputation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And we can now call our function like so&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;n&quot;&gt;future&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;I&apos;m running concurrently! whoop!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The Scala bits that may throw you here are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block: =&amp;gt; Unit&lt;/code&gt; is a pass-by-name value that returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Unit&lt;/code&gt; (not executed until called).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block&lt;/code&gt; on line 6 evaluates the user-provided code within the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;run&lt;/code&gt; method, which is called
       once the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Thread&lt;/code&gt; is running.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{ ... }&lt;/code&gt; is a block of code that is passed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; as the first parameter to the function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just a quick note on point &lt;strong&gt;#1&lt;/strong&gt;: Pass-by-name means that we can pass around blocks of user-code without
actually executing them. Only once we request the “value” from the block (like we do on line 6 above),
is the code executed. This is essential for how our futures execute code asynchronously.&lt;/p&gt;

&lt;p&gt;Fantastic! Now we just need to somehow return a result and we’re done, right? Well, not exactly. While
that would get us pretty close to the initial definition, I want to stay a little more grounded and
mimic what a future implementation would do in practice. We’re also missing something from our current
function.&lt;/p&gt;

&lt;p&gt;In a real, multi-threaded application there are often multiple operations happening at once; many of
which may be simultaneously using futures. However, not all futures are equally important. For example,
pushing work to a queue that came from a user is arguably more important than flushing metrics to your
metrics store. Currently, we create a thread for each future. It is up to the threads to fight it out
with the JVM/OS scheduler for resources. A better solution would make use of thread pools.&lt;/p&gt;

&lt;p&gt;Thread pools are small groups of threads that work is executed on. If there is more work than threads
in the pool, then they are queued up and executed once a thread from the pool is available. We can
control priority within our application by creating larger pools for more important, time-sensitive
work and smaller pools for less important, less critical work.&lt;/p&gt;

&lt;p&gt;Let’s rewrite our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; function to work with a Java thread pool!&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.concurrent.LinkedBlockingQueue&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.concurrent.ThreadPoolExecutor&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.concurrent.TimeUnit&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isShutdown&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isTerminating&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isTerminated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&quot;Cannot execute on threadpool that is not active/running.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0L&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                                &lt;span class=&quot;nv&quot;&gt;TimeUnit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;MILLISECONDS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                                &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LinkedBlockingQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Runnable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;I&apos;m running concurrently! whoop!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We now have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; function that works with thread pools! To explain some things&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; has multiple parameter lists &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(...)&lt;/code&gt;. This allows us to continue to use the block-syntax
       for user-provided code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{ ... }&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; now throws a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RuntimeException&lt;/code&gt; if it is given a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ThreadPoolExecutor&lt;/code&gt; that is not usable.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tp.execute(...)&lt;/code&gt; adds work to the thread pool’s queue and runs it asynchronously.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;4)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tp&lt;/code&gt; on line 19 is a thread pool with exactly 4 threads which uses a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LinkedBlockingQueue&lt;/code&gt; as the
       backing queue when there is more work than available threads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;part-2---returning-the-result&quot;&gt;Part 2 - Returning the Result&lt;/h2&gt;

&lt;p&gt;We’re quickly working our way towards a future implementation, but currently we don’t have a way to
return a value back to the caller. According to our definition at the beginning, we need to use some
sort of “proxy” object that will eventually contain the value. Let’s define what this proxy object could
look like.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;None&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// writer functions&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// read functions&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isReady&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isDefined&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(!&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isReady&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;Future is not ready yet, no value to get&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Some quick notes&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[T]&lt;/code&gt; is a generic type of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt; to be determined by the user.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option&lt;/code&gt; is a type that is either present (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Some&lt;/code&gt;) or absent (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3)&lt;/strong&gt; If the future is not completed, we throw an exception on access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we have our “proxy” object, we can update our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; function to return a value using our new
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future[T]&lt;/code&gt; class.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;fut&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isShutdown&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isTerminating&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isTerminated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&quot;Cannot execute on threadpool that is not active/running.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// call user-provided code and write result to the future&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;
      &lt;span class=&quot;nv&quot;&gt;fut&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fut&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Some quick notes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block&lt;/code&gt; is now a block of code that evaluates to a type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; now has type-parameter of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt; and a return type of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future[T]&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3)&lt;/strong&gt; The value of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future[T]&lt;/code&gt; is written inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;run&lt;/code&gt; function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this newly updated function, we can still call it the same way. The exception is that it now means
something if we capture the result.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I&apos;m running concurrently! whoop!&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Awesome! We have our proxy object. But the next question becomes, “How do I use it?” If we wanted to
wait on the call we made above for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt;, we might do something like the following:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;MaxWait&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isReady&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MaxWait&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This code is far from ideal, but it works for what we want to do. Later on in this article we’ll get
to more advanced (and more idiomatic) techniques for working with future values.&lt;/p&gt;

&lt;p&gt;However, even though this works, there are two issues with this setup: The first is that anyone can
write a value into the future. Ideally this should be hidden as part of the async processing and
separated from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; object. For example, this code should not be valid:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// sleep future for 1s&lt;/span&gt;
  &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// prints 6&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// value of f set to 5 1 second later&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The second issue is that the value is not immutable. Once it is written, it should not be possible
to change the value. As in our example above, once the future stops sleeping, the value would change
to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5&lt;/code&gt;. A future is always the result of a single computation, and that value must never change.&lt;/p&gt;

&lt;p&gt;First let’s address the issue that anyone can write into our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt;. The common way this is solved
is to introduce another type, called the promise. If a future is meant to read the value, then the
promise is meant to write the value. By creating two separate objects, we can hand them to the
appropriate parties. Let’s see what this would look like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isReady&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isReady&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;None&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;lazy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;futurePair&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// writer functions&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// reader functions&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isReady&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isDefined&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isReady&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;Future is not ready yet, no value to get&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;With this new version we can see that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; is now just a read-only interface to our new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt;
class, and that each future contains a private reference to its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; pair. The new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; class
is mostly the same as our original &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; implementation with two exceptions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; A new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;futurePair&lt;/code&gt; value which creates a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; object that is paired with the current &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt;
       object. This is only generated when needed (thus the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lazy&lt;/code&gt; part).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; All read and write methods are now contained in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;this.synchronizedblocks&lt;/code&gt;, which synchronizes access
       to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; object. This is good practice for any object that will be accessed from multiple
       threads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, even with this separation of concerns, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; can be written to more than once. Since we’ve
already synchronized our methods (ensuring no concurrent updates), we can add a simple check to solve
our problem:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;None&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isWritten&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Boolean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// writer functions&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isWritten&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;Cannot write value. Already written&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isWritten&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// other functions ...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;part-3---handling-failures&quot;&gt;Part 3 - Handling Failures&lt;/h2&gt;

&lt;p&gt;We can now return values from futures, but what happens if the computation fails and we throw an
exception? How do we handle that? What value is returned for the future?&lt;/p&gt;

&lt;p&gt;Well exceptions are easy, we can just use a try-catch block for that, right?&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sorry!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;whoops! something went wrong&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;I’m sorry, but no. This is never going to work.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;data:image/jpeg;base64, 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&quot; alt=&quot;Future! Credit: https://goo.gl/VWghzJ&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Why you ask? Well, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;throw&lt;/code&gt; in the above code is actually not called on the current thread.
Remember that the code in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block&lt;/code&gt; is not evaluated until called within the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Runnable.run&lt;/code&gt; method. It
is called asynchronously on another thread — and guess what? That exception will not propagate to
the current thread the above code is executing on. What would actually happen is that future &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt; would
just never receive a value because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise.write&lt;/code&gt; would never be called.&lt;/p&gt;

&lt;p&gt;Well the answer is simple right? Just put the try-catch inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Runnable.run&lt;/code&gt; function that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt;
creates to execute the code block. Well, what if an exception occurs, what value do you return? To
handle this, we need to wrap our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt; value in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future[T]&lt;/code&gt; in a success/fail object:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;trait&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;throwable&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Throwable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;With these new types, we can now represent the result of a future, previously just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt;, as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try[T]&lt;/code&gt;.
Of course with this, we need to update our read and write functions:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;None&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;As well as our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; function:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// omitted code&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// call user-provided code and write result to the future&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;futurePair&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Now that we are wrapping values into either a success or failure state and capturing any exceptions,
we can now write code like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;util&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;nextBoolean&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;I&apos;m running concurrently! whoop!&quot;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;We were unlucky... bummer&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;MaxWait&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isReady&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MaxWait&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Here we are creating a future which may or may not fail, depending on a randomly generated boolean.
Once we’ve waited for it to complete, we access the value with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get&lt;/code&gt; and then use pattern matching
(the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;match&lt;/code&gt; keyword and a popular feature of Scala) to either print the returned string or the
error trace, depending on the value returned.&lt;/p&gt;

&lt;h2 id=&quot;part-4---async-access&quot;&gt;Part 4 - Async Access&lt;/h2&gt;

&lt;p&gt;To recap what we’ve created so far:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; method that takes a block of code, executes on a thread-pool, and returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; class for reading values, and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; for writing values.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Try[T]&lt;/code&gt; to represent success and failure values from our asynchronously executed code-block.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a good start to creating a realistic implementation of futures. However, there are still some
very big holes. Namely, accessing the final value leaves a lot to be desired. Currently to get the
value we have to block on the current thread and wait for the future to be completed.&lt;/p&gt;

&lt;p&gt;The easy way to not block is to provide callback functions. Callbacks are user-provided blocks of code
that are registered with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; object and called once the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; is ready. We’ll define three
functions: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onComplete&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onSuccessand&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onFailure&lt;/code&gt;. Let’s start first with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onComplete&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;registerOnComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;  &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;onCompleteHandlers&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Nil&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;registerOnComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// add 2-tuple of thread-pool and function to list&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;onCompleteHandlers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;::=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;callOnCompletes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;onCompleteHandlers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;_1&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Unit&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;_2&lt;/span&gt;

      &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isWritten&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;Cannot write value. Already written&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isWritten&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;callOnCompletes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We now have a new method on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onComplete&lt;/code&gt; which registers a callback handler with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt;.
The reason that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; handles the firing of the callback is because it maintains the relationship
that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; is read-only and that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; is the write interface. With this, we can fire the callbacks
as soon as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise.write&lt;/code&gt; is called.&lt;/p&gt;

&lt;p&gt;Some final notes about the above code:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;1)&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onCompleteHandlers&lt;/code&gt; is a list of 2-tuples containing the thread pool and the block of code to execute on the
       result. It is also initialized to an empty list (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Nil&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2)&lt;/strong&gt; The code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onCompleteHandlers ::= (tp, f)&lt;/code&gt; appends a 2-tuple to the list &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onCompleteHandlers&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3)&lt;/strong&gt; Values in 2-Tuples are accessed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x._1&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x._2&lt;/code&gt; as on line 23 and 24.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And we can now use our new function like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;scala&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;util&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;nextBoolean&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;I&apos;m running concurrently! whoop!&quot;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;We were unlucky... bummer&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;onComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;With this, we could easily imagine how to write other functions such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onSuccess&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onFailure&lt;/code&gt;, etc.&lt;/p&gt;

&lt;h2 id=&quot;part-5---composing-futures&quot;&gt;Part 5 - Composing Futures&lt;/h2&gt;

&lt;p&gt;Callbacks are an excellent way to access data retrieved/generated from an asynchronous operation.
However, what if we wanted to combine the value from two async operations, or we wanted to transform
the result of an async operation, but still maintain a future to that transformed value in the current
thread? This is where futures really shine: The ability to combine the result of multiple futures
together.&lt;/p&gt;

&lt;p&gt;To achieve this, we need to have callbacks that return yet another &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; as a proxy object to a
result of the callback. The first function we’ll look at is map with the following signature:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](...)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; takes a thread pool and a function and returns another future. The user-provided function, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt;,
takes as a parameter a successful value from the current future and returns a value of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;U&lt;/code&gt;.
However &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; returns a value of type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future[U]&lt;/code&gt;. This allows us to call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; on a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt; that may or
may not be completed. This means that we can’t return the result of our transformation (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt;) directly,
but must use another &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future&lt;/code&gt;. This is best explained with some examples:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// base future we&apos;ll be map&apos;ing&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// sleep 2 seconds&lt;/span&gt;
  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// multiply f by 10&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f10&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;two&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;two&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// turn into a string&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;two&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;two&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;toString&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt; takes at least 2 seconds to run, you can see why we can’t immediately apply our
transformations to the value. Instead we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; to defer the transformations for when the future
has completed, but we can still hold onto a proxy object representing the result of those
calculations.&lt;/p&gt;

&lt;p&gt;But what happens if the future being mapped fails? In that case the error propagates to all failed
values:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;whoops!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f10&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;f10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;onComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// do nothing&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;     &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;The above code would print out a stacktrace for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f10&lt;/code&gt;. The stacktrace would say “whoops!” and would
be the same exception from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt; passed along to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f10&lt;/code&gt;. This makes sense, as we cannot transform an
exception as if it were a successful value.&lt;/p&gt;

&lt;p&gt;Enough examples, let’s take a stab at implementing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](...)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;mapPromise&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// create onComplete block that calls user-function (f) on success&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// and passes through exceptions on failure&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Try&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;futureWithPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mapPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;mapPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;registerOnComplete&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;mapPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;futurePair&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You can see that we are defining this on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt;. This is because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Promise&lt;/code&gt; is our writable interface
and we want to take advantage of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;registerOnCompletefunction&lt;/code&gt; we saw earlier. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; works by creating
a new promise/future pair and returning the future immediately. However the callback that is
registered allows us to call our user-provided function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt; in the callback and write the result to the
new promise/future pair we created. For failures we can see the write happening:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;mapPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This allows us to propagate failure and by-pass the user-provided code which expects a value. This
allows us to call map without having to worry about additional error handling.&lt;/p&gt;

&lt;p&gt;But wait, what is this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;futureWithPromise&lt;/code&gt; function, and what does it do? Remember &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; from earlier
that takes a block of user code and a thread pool and returns a future? Well this is pretty much the
same thing except that it takes a pre-created promise object. With this, we can re-define our
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;future&lt;/code&gt; method as well (to avoid duplication) and we get:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;simple.future&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;futureWithPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
                        &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isShutdown&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isTerminating&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;isTerminated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;&quot;Cannot execute on threadpool that is not active/running.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Runnable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// call user-provided code and write result to the future&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Failure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;futurePair&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;promise&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;futureWithPromise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We can see that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;futuerWithPromise&lt;/code&gt; is basically our previous implementation of future and future is
now just a convenience method for when you don’t have your own Promise already created.&lt;/p&gt;

&lt;h3 id=&quot;so-much-more&quot;&gt;So much more!&lt;/h3&gt;

&lt;p&gt;When it comes to composing futures, there is often a myriad of functions available to transform futures
in different ways. For example, these two functions are very common (although the naming may differ
across implementations):&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](...)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;flatMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;recover&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tp&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Throwable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatMap&lt;/code&gt; is very much like our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt;, but this allows the user-provided code to return a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Future[U]&lt;/code&gt;
instead of just a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;U&lt;/code&gt;. Think of making a web-request which returns a future, and then using the result
of the first web-request to make a second web-request. For this case you would use a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatMap&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;recover&lt;/code&gt; is a way to not only handle a failed future, but also provide/calculate some sort of default
value. Imagine making a web-request and, assuming it fails, using recover to provide a cached result.
When combining recover with other compositing functions like map and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatMap&lt;/code&gt;, we can define a future
with all of our transformations and error handling in a declarative way.&lt;/p&gt;

&lt;p&gt;Since you’ve seen the basic format for implementing these type of functions (with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; example),
I’ll leave it as an exercise to the reader (you) to define &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatMap&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;recover&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;That was quite a bit of work! This is still a very bare-bones, basic implementation of futures but,
it should be enough to give us some solid ground to stand on for understanding futures, and hopefully
understanding why this is a useful (in my humble opinion) and popular abstraction. If you’re interested
in what a real-world future implementation looks like, check out some of the links below (note that
this post most closely mimics the API of the Scala implementation):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://docs.scala-lang.org/overviews/core/futures.html&quot;&gt;Scala Library&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://tokio.rs/docs/getting-started/futures/&quot;&gt;Rust&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://en.cppreference.com/w/cpp/thread/future&quot;&gt;C++ stdlib&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html&quot;&gt;Java 8&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ff963556.aspx&quot;&gt;C#&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!--

TODO: link these things

Link to some various future implementations to read / learn more
  - Scala impl  (stdlib versions)
  - rust impl?  (if there is a good one to link to)
  - C++ impl    (stdlib ones)
  - Java impl   (java 8 completable futures)
  - Ruby impl   (celluloid?)

--&gt;

</description>
        <pubDate>Thu, 22 Jun 2017 12:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2017/06/22/The-Futures-Abstraction.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2017/06/22/The-Futures-Abstraction.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Your Team Should Write SBT Plugins</title>
        <description>&lt;p&gt;&lt;strong&gt;Every Scala development team should be writing their own SBT plugins. If you’re not then
you’re doing it wrong&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is an &lt;s&gt;assertion&lt;/s&gt; assumption I am making based on what I’ve seen so far in my limited
experience working on/with various teams and their Scala applications.&lt;/p&gt;

&lt;h2 id=&quot;standards&quot;&gt;Standards&lt;/h2&gt;

&lt;p&gt;Organizations (not just large ones) typically have standards. Standards for various things including&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;code style&lt;/li&gt;
  &lt;li&gt;application packaging&lt;/li&gt;
  &lt;li&gt;release process&lt;/li&gt;
  &lt;li&gt;deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The list goes on. The general idea however is that if you are building a new application, it should
conform to the standards that (ideally) all the other applications in the organization follow.&lt;/p&gt;

&lt;p&gt;Now if we’re talking about Scala projects, we have some wonderful tools for defining all of these
standards. Specifically I’m talking about SBT. It is the Scala developer’s Swiss army knife. I know
that if I start a Scala project today I can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-release&lt;/code&gt; for defining my release process
(all the steps / actions I take to release my code) which includes essentials standards items such
as a versioning scheme. I can also use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-native-packager&lt;/code&gt; to build &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deb&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rpm&lt;/code&gt; packages
for Linux or docker images for [&lt;em&gt;insert cloud platform here&lt;/em&gt;]. I may also set up my applications
with a few useful utilities depending on what I’m writing, such as&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scalastyle&lt;/code&gt; (and/or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-checkstyle&lt;/code&gt; if I have some Java code as well)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-reloader&lt;/code&gt; (for easy running of my app locally)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-doge&lt;/code&gt; (if I’m managing multiple release versions of a lib, or developing an SBT plugin as part
of a suite of libraries)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-dependency-graph-sugar&lt;/code&gt; (for viewing pretty dep-graphs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The list goes on. And a lot of it depends on the style or particular flavor of Scala development
at each organization.&lt;/p&gt;

&lt;h2 id=&quot;maintaining-consistency&quot;&gt;Maintaining Consistency&lt;/h2&gt;

&lt;p&gt;So you got your recipe of Scala programming goodness all bundled up in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build.sbt&lt;/code&gt;, that’s
great! But wait, how do you make sure that other projects use the same data. Well you could just
copy it around at first if we’re talking about a handful of applications. Beyond that maybe we
make a general template that people clone from to start their projects. But wait, what if the
organization decides it wants to add a new step to that sweet release process you wrote using
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-release&lt;/code&gt;? Well, now you need to hop from project to project, updating each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build.sbt&lt;/code&gt;. And
you can’t just copy and paste anymore because you might override some application-specific settings
that have built up over time.&lt;/p&gt;

&lt;p&gt;There is actually a very simple solution to this problem, organizational SBT plugins. These are plugins that
are written for the express purpose of wrapping up all these organizational standards into simple SBT
plugins. You have an awesome release process? Great! Wrap that up into an SBT &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AutoPlugin&lt;/code&gt; that uses
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sbt-release&lt;/code&gt; plugin internally. All that is required for an application to conform to the
standard release process is to add a simple addition to their project definition.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;span class=&quot;nv&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;enablePlugins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;OrganizationReleasePlugin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;using-archetypes&quot;&gt;Using Archetypes&lt;/h2&gt;

&lt;p&gt;Once you start wrapping this functionality up into your own SBT plugin, you may notice that not &lt;em&gt;all&lt;/em&gt;
of the applications in your organization fit the same mold. For that we have archetypes. An archetype
is a “top-level” &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AutoPlugin&lt;/code&gt; for a particular application type.  Archetypes are very much like meta-packages
in OS package management systems; it is a collection of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AutoPlugin&lt;/code&gt;s tailored for that specific use case.&lt;/p&gt;

&lt;p&gt;For example, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScalaWebService&lt;/code&gt; archetype may contain specific plugins and settings for a PlayFramework
application where as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AkkaKernel&lt;/code&gt; archetype will have a slightly different set of plugins and settings.
Additionally if your organization supports both Java and Scala, you can make those separate archetypes
as well to make the provided plugins more tailored toward specific application needs while still maintaining
a set of standards for each supported archetype.&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Sep 2016 00:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2016/09/02/Every-Scala-Team-Writes-Plugins.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2016/09/02/Every-Scala-Team-Writes-Plugins.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Deploying Jekyll to Heroku</title>
        <description>&lt;p&gt;So you have a static site in Jekyll that you want to deploy to
&lt;a href=&quot;http://www.heroku.com/&quot;&gt;Heroku&lt;/a&gt;. Lucky for you, this is a relatively easy task and does not
require anything as complex as a deployment server as mentioned in the
Jekyll docs. You can support this with a simple &lt;a href=&quot;http://rack.github.io/&quot;&gt;Rack&lt;/a&gt; script.&lt;/p&gt;

&lt;p&gt;For those not familiar, &lt;a href=&quot;http://rack.github.io/&quot;&gt;Rack&lt;/a&gt; is a bare-bones web-server adapter in
Ruby. Most Ruby web-frameworks sit on “top” of Rack while the Ruby web-servers
sit “underneath” of it. However, we don’t need all the complexities of a web-framework
to serve our static content, so we only need Rack and any Rack-compatible
web-server to accomplish our goals.&lt;/p&gt;

&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;

&lt;p&gt;The bare minimum that you’ll need are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Jekyll site to publish&lt;/li&gt;
  &lt;li&gt;Your favoriate text editor&lt;/li&gt;
  &lt;li&gt;Heroku account to push to&lt;/li&gt;
  &lt;li&gt;Ruby (recent version)&lt;/li&gt;
  &lt;li&gt;Bundler (gem)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are a lot of ways to install Ruby so I’ll leave this to you. I will
say that I prefer &lt;a href=&quot;https://github.com/rbenv/rbenv&quot;&gt;rbenv&lt;/a&gt; for its ease of use. Once you have Ruby
set up, you can install Bundler via&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;bundle&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;gemfile&quot;&gt;Gemfile&lt;/h2&gt;

&lt;p&gt;The first thing we need to declare is all of our runtime requirements for our Rack
script that we’ll write later. Put this in a file called &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;https://rubygems.org&apos;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ruby&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2.2.0&apos;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;rack-contrib&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;puma&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This file is rather simple, we’re stating the source of our gems (the official repo),
the Ruby version (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.2.0&lt;/code&gt;) and a couple of gems. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rack-contrib&lt;/code&gt; gem will pull in
some stuff for static-asset serving (as well as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rack&lt;/code&gt; itself) and &lt;a href=&quot;http://puma.io/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;puma&lt;/code&gt;&lt;/a&gt; is
our Rack-compatible web-server.&lt;/p&gt;

&lt;p&gt;Once we have our &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;&lt;/strong&gt; we need to create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lock&lt;/code&gt; file. This will be used
to “lock in” specific versions of gems so that what we try out locally should be
exactly the same when we deploy it to Heroku. We can create this with&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You should now have a &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile.lock&lt;/code&gt;&lt;/strong&gt; in your directory. Do not edit this file.&lt;/p&gt;

&lt;h2 id=&quot;rack&quot;&gt;Rack&lt;/h2&gt;

&lt;p&gt;Now that we have the required gems installed, we can get down to writing our Rack
file that will serve our static assets. Create a file &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.ru&lt;/code&gt;&lt;/strong&gt; with the
content&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;rack&apos;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;rack/contrib/try_static&apos;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# enable compression&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Rack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Deflater&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# static configuration (file path matches reuest path)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Rack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;TryStatic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;_site&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# static files root dir&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:urls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;%w[/]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# match all requests&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;index.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;/index.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# try these postfixes sequentially&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:gzip&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;# enable compressed files&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:header_rules&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Cache-Control&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;public, max-age=86400&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}],&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;css&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;js&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Cache-Control&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;public, max-age=604800&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# otherwise 404 NotFound&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;notFoundPage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;_site/index.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;read&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Content-Type&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;text/html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;notFoundPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Let’s break this file into the important parts. The first thing we do is import
the required gems. This is self explanatory. Next we see&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Rack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Deflater&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This bit of code will enable compression on any content that is served. This will speed up
your page load time, especially for those with slower internet connections. The next section
is the real meat of our Rack file&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Rack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;TryStatic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;_site&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# static files root dir&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:urls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;%w[/]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# match all requests&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;index.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;/index.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# try these postfixes sequentially&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:gzip&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;# enable compressed files&lt;/span&gt;
      &lt;span class=&quot;ss&quot;&gt;:header_rules&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Cache-Control&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;public, max-age=86400&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}],&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;css&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;js&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Cache-Control&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;public, max-age=604800&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This portion defines our static asset handler. The first thing it does is set the “root” of the
content directory to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site&lt;/code&gt;. This means that if a request comes to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/index.html&lt;/code&gt; that our static
asset handler will look in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/index.html&lt;/code&gt;. Since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site&lt;/code&gt; is the default folder for Jekyll
auto-generated content, we should be good to go here.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;url&lt;/code&gt; defines how we want to match requests. If we wanted to have a Jekyll site as only a
sub-section of our site, this would be useful. Since, for the purposes of this example, the Jekyll
site comprises the entire web-site we can define this as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt; to mean the “root” of the web-site.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;try&lt;/code&gt; defines various extensions to try when receiving a request. So given what we’ve seen so
far, if the application receives a request of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/awesome-article&lt;/code&gt; it will check for the following
files in order&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/awesome-article&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/awesome-article.html&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/awesome-articleindex.html&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/awesome-article/index.html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this we can make a variety of requests and get very clean URLs without having to include the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.html&lt;/code&gt; extensions or without having to specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index&lt;/code&gt; when visiting the root of the site (e.g.
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;www.mysite.com&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gzip&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;header_rules&lt;/code&gt; options simply allow caching to work which we defined earlier. This
should help to significantly speed up your site, especially as visitors click from page to page as
they will avoid re-loading common resources such as CSS or JS files.&lt;/p&gt;

&lt;p&gt;This last part is especially nifty.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# otherwise 404 NotFound&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;notFoundPage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;_site/index.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;read&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;Content-Type&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;text/html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;notFoundPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This will redirect any request that we can’t understand (broken link or just bad URL) back to the
homepage. You could, if you wanted to be really fancy here, provide a custom “Not Found” page. Let
your imagination run wild.&lt;/p&gt;

&lt;h2 id=&quot;procfile&quot;&gt;Procfile&lt;/h2&gt;

&lt;p&gt;If we are deploying to Heroku, we need to create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Procfile&lt;/code&gt; that tells Heroku how to run our site.
We can create a simple file as&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;web&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This instructs Heroku to use our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;puma&lt;/code&gt; gem to run our web-service and some additional parameters that
Heroku requires (you can safely ignore these).&lt;/p&gt;

&lt;h2 id=&quot;releasing&quot;&gt;Releasing!&lt;/h2&gt;

&lt;p&gt;We are now ready to push to Heroku! Assuming you’ve already setup your Heroku account and have
authenticated in your local repo. We can run the following bit to deploy.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Add all of the files we&apos;ve recently created&lt;/span&gt;
git add Gemfile Gemfile.lock Procfile config.ru
git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Adding required files for deploying to Heroku&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Regnerate your site&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; ./_site
jekyll build

&lt;span class=&quot;c&quot;&gt;# Add your site to your git repo (important for Heroku to work)&lt;/span&gt;
git add ./_site
git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rebuilt site&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# deploy to heroku via git push (assuming remote for Heroku already setup)&lt;/span&gt;
git push heroku master&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Personally, I like to put all of this into a Makefile sot that I can automate this process.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-make&quot; data-lang=&quot;make&quot;&gt;&lt;span class=&quot;nl&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;deploy&lt;/span&gt;

&lt;span class=&quot;nl&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
	&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; ./_site
	jekyll build
	git add ./_site
	git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rebuild of ./_site dir for release&quot;&lt;/span&gt;
	git push heroku master&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

</description>
        <pubDate>Mon, 08 Aug 2016 00:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2016/08/08/Jekyll-on-Heroku.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2016/08/08/Jekyll-on-Heroku.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Inspecting JSON From The Command Line</title>
        <description>&lt;p&gt;Sometimes you need to inspect some heterogeneous JSON documents. When it comes to working with JSON
there are a lot of great libraries out there. However, there aren’t many tools out there that
allow me to work with JSON in the shell without resorting to writing small custom bits of Python
or Ruby each time. And even this doesn’t always get me as far as I’d like it to without writing
larger blocks of Ruby/Python code to dig through large / complex JSON documents.&lt;/p&gt;

&lt;p&gt;Given the title of this post, you can see where this is heading. I have created a simple command
line utility as a gathering place of functionality for inspecting JSON documents. I’ll show off
some features of the tool.&lt;/p&gt;

&lt;p&gt;If you want to follow-along with the examples I’m showing, feel free to install the tool from
&lt;a href=&quot;https://pypi.python.org/pypi/json-inspect&quot;&gt;PyPi&lt;/a&gt; via&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;json-inspect&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Let’s first make a file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;test.json&lt;/code&gt; to contain some fake JSON data to play with&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;facebook&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;demographic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;regions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Kentucky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Louisville&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;google&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;demographic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;regions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Kentucky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Highland Heights&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;twitter&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;demographic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;regions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;UK&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Wales&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;frequency&quot;&gt;Frequency&lt;/h2&gt;

&lt;p&gt;If you are working with JSON data that you do not control (think data integrations)
then you sometimes need to compare their specification of the data with the data
you are actually receiving. For this we can create a histogram of values based on a
search expression.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;test.json | json-inspect histo &lt;span class=&quot;s1&quot;&gt;&apos;[].*.user.demographic.regions.[].name&apos;&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt;.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.user.demographic.regions.[].name:
Highland Heig   | &lt;span class=&quot;c&quot;&gt;#########################                          | (1)&lt;/span&gt;
US              | &lt;span class=&quot;c&quot;&gt;################################################## | (2)&lt;/span&gt;
Louisville      | &lt;span class=&quot;c&quot;&gt;#########################                          | (1)&lt;/span&gt;
Kentucky        | &lt;span class=&quot;c&quot;&gt;################################################## | (2)&lt;/span&gt;
UK              | &lt;span class=&quot;c&quot;&gt;#########################                          | (1)&lt;/span&gt;
Wales           | &lt;span class=&quot;c&quot;&gt;#########################                          | (1)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Maybe I’m biased, but this is great! I was able to inspect this JSON document with
minimal command-line-foo.&lt;/p&gt;

&lt;h2 id=&quot;search-paths--expressions&quot;&gt;Search Paths / Expressions&lt;/h2&gt;

&lt;p&gt;The heart of the previous example is the search expression. It currently consists of
three parts (working on a recursive &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;**&lt;/code&gt; operator) which are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]&lt;/code&gt; - Represents an array (containing objects)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*&lt;/code&gt; - Represents all fields within an array&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TOKEN&lt;/code&gt; - This is a field name within an object&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[]&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*&lt;/code&gt; tokens will result in all values being processed by the next token
in the path. The path itself is delimited by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt;, so this means that field-names
with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt; in them are not supported.&lt;/p&gt;

&lt;h2 id=&quot;values&quot;&gt;Values&lt;/h2&gt;

&lt;p&gt;And if instead of creating charts based on values we instead wanted to extract
those values, we can do that as well. An example&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;test.json | json-inspect ext &lt;span class=&quot;s2&quot;&gt;&quot;[].*.user.demographic.regions.[].*&quot;&lt;/span&gt;
Louisville,Kentucky,US,Highland Heights,Kentucky,US,Wales,UK&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We can also control the delimiter to make piping values into other command-line tools
easier.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;test.json | json-inspect ext &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;|&apos;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[].*.user.demographic.regions.[].*&quot;&lt;/span&gt;
Louisville|Kentucky|US|Highland Heights|Kentucky|US|Wales|UK&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;keys&quot;&gt;Keys&lt;/h2&gt;

&lt;p&gt;So far we’ve seen inspection tools around the values within JSON, but what if we want to
see what keys are available within the JSON document? We can easily pull all keys of a JSON
document out with&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;test.json | json-inspect keys
facebook.user.demographic.regions.name
google.user.demographic.regions.name
twitter.user.demographic.regions.name&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Additionally, we can provide some options which will filter out nulls, empty objects,
empty primitives, and empty arrays as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-n&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-o&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-p&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-e&lt;/code&gt; respectively. We could
introduce some new fields to our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;facebook&quot;&lt;/code&gt; object to test.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;facebook&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;demographic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;regions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;US&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Kentucky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Louisville&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;null&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;empty_object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;empty_array&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;empty_primitives&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;int&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;float&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Okay, so if you just ran the same command we used earlier, you would see all of these new
keys. But we can easily filter some or all of them out with some options. To get back to
our original set&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;test.json | json-inspect keys &lt;span class=&quot;nt&quot;&gt;-nope&lt;/span&gt;
facebook.user.demographic.regions.name
google.user.demographic.regions.name
twitter.user.demographic.regions.name&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;the-source&quot;&gt;The Source&lt;/h2&gt;

&lt;p&gt;This is up on my GitHub under the &lt;a href=&quot;https://github.com/JohnMurray/json-inspect&quot;&gt;json-inspect&lt;/a&gt; project where you can find more
information and documentation. I plan to contribute further to this project as I have
need, but if you have ideas for useful features and want to contribute, feel free to
open PRs.&lt;/p&gt;

</description>
        <pubDate>Mon, 25 Jul 2016 00:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2016/07/25/Inspecting-JSON-From-The-Command-Line.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2016/07/25/Inspecting-JSON-From-The-Command-Line.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Poor Man&apos;s Actors in Java</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Actor_model&quot;&gt;Actors&lt;/a&gt; are a fantastic way to model concurrency and a much easier mental model
than when working with plain threads and shared memory. However let’s say that you’re
writing a very simple library that needs to run some simple background tasks. You could
pull in one of the popular Actor implementation libraries out there, but they don’t come
for free and can sometimes be heavy-weight.&lt;/p&gt;

&lt;p&gt;There is a small movement in the JVM communities to move toward completely self-contained
libraries. I am personally in favor of this movement, but it does mean it can make writing
libraries a touch more difficult. So, if I’m writing a library and I want to do some async
stuff and I &lt;em&gt;really&lt;/em&gt; like using actors, what do I do? Well I personally like to program in
the actor model (primarily) for two things&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Messages are immutable&lt;/li&gt;
  &lt;li&gt;Message passing as a way of communicating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the question is, can we get this with zero runtime dependencies? Of course we can, but
how much work is it going to be? Let’s find out.&lt;/p&gt;

&lt;h2 id=&quot;the-exercise&quot;&gt;The Exercise&lt;/h2&gt;

&lt;p&gt;Before we jump right into the meaty bits, we need to setup a problem that our examples will
be trying to solve.
Let’s say that I’m writing a library that will do some local file-caching. As part of this,
the library needs to handle &lt;em&gt;active&lt;/em&gt; cache expiry. Active meaning that we don’t wait until
the value is read again to do the cleanup, meaning we need some sort of asynchronous monitor.&lt;/p&gt;

&lt;h2 id=&quot;immutable-messages&quot;&gt;Immutable Messages&lt;/h2&gt;

&lt;p&gt;There is nothing stopping from creating immutable data-structures in Java. However it may not be
as easy as using say case classes in Scala. However it is most certainly &lt;em&gt;possible&lt;/em&gt;. However, this
one is pretty easy to get with very little work on our part.  Java has long had annotation
processors, which is a way to generate code based on annotations at compile time. You can imagine
that this is very useful, especially for defining immutable objects. Luckily for us, someone
has already went through the work to create a generator for immutable data. If you are not
already familiar, meet &lt;a href=&quot;http://immutables.github.io&quot;&gt;Immutables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s define some models that we’ll use later&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nd&quot;&gt;@Value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Immutable&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CacheCreated&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;Path&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getFilePath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;Long&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getTtl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;TimeUnit&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getTtlUnit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@Value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Immutable&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CacheExpired&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;Path&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getFilePath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;That’s it! We now have immutable data-objects that are easy to work with. Let’s move on to the Actors.&lt;/p&gt;

&lt;h2 id=&quot;actors&quot;&gt;Actors&lt;/h2&gt;

&lt;p&gt;Well we already know we have threads for running concurrent operations, but how do we handle the message
passing? Simple, we define a mailbox that actors receive messages into and process out of. But what is
a mailbox if not just a simple queue. Java has a bunch of those! In fact, there is a nice thread-safe
one that works for us, the &lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ConcurrentLinkedQueue&lt;/code&gt;&lt;/a&gt;. So that means we can define an actor as&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;actor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;poll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// process message&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// handle exception(s)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Let’s break this down so we understand all that is happening here. First the mailbox&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;All variables used within lambdas or anonymous inner classes must be effective final, thus the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;final&lt;/code&gt;. Note
that we are also typing the collection to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Object&lt;/code&gt;, why? This allows us to send any kind of messages to our
actors and the actors can pattern match to find out what the message is. Since we’re in Java, pattern matching
really just means doing a bunch of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;instaceof&lt;/code&gt; statements.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;To keep the actor alive, the thread cannot end or be “done.” Because of this, we have the thread run in
an infinite loop. However we also don’t want our process in a “busy wait.” To get around this we sleep for
10ms at the beginning of each loop. 10ms is arbitrary and is just represents the trade-off between using
resources and responding to events in a timely manner.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;poll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Attempt to read the first thing in the mailbox (if anything is there). If there is nothing in the mailbox then
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; is returned. In this case we simply jump back up to the beginning of the infinite loop which causes us to
sleep for 10ms before checking again.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;poll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// process message&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// handle exception(s)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;For the same reason that we put everything into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;while&lt;/code&gt;, we also need to catch any errors that might occur.
If an exception is thrown, then we need to have code to handle the error and allow the actor to continue
processing. Otherwise the exception could crash our thread and effectively kill our actor. Note that supervision
is not something our implementation has.&lt;/p&gt;

&lt;h1 id=&quot;file-caching-actors&quot;&gt;File-Caching Actors&lt;/h1&gt;

&lt;p&gt;For my system I will define two actors. One actor to receive created events and monitor &lt;em&gt;when&lt;/em&gt; cache
items should be expired. This actor will send messages to another actor which will take care of the
actual file deletion.&lt;/p&gt;

&lt;p&gt;Putting what we defined above to good use, I can define my actor as&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ttlWatcherMailbox&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cacheDeleterMailbox&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cacheWatcher&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DateTime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cacheExpiry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HashMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++;&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

      &lt;span class=&quot;c1&quot;&gt;// check for new items to store&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ttlWatcherMailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;poll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CacheCreated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;CacheCreated&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;CacheCreated&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;cacheExpiry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFilePath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calculateExpiryDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTtl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getTtlUnit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// log unhandled message&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;c1&quot;&gt;// scan cached objects (every 100ms, roughly)&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Entry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DateTime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cacheExpiry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;iterator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isExpired&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;cacheDeleterMailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;offer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ImmutableCacheExpired&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
              &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;filePath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;
              &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// log out errors&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cacheDeleter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

      &lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cacheDeleterMailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;poll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CacheExpired&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;CacheExpired&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ce&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;CacheExpired&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;deleteFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFilePath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// log unhandled message&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// log out errors&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;n&quot;&gt;cacheWatcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cacheDeleter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Bam! We now have simple actors performing our background jobs and communicate by message passing. We
could take this further if wanted and use some of Java’s concurrent blocking queues which would give
us back-pressure as well. And like that, there are many small things you could do to add the features
that you most value in a full-blown actor framework / library.&lt;/p&gt;

&lt;h2 id=&quot;improving-our-api&quot;&gt;Improving our API&lt;/h2&gt;

&lt;p&gt;If we want to take our working code a little bit further we can improve the current API to abstract
some of the details for how this is working. First let’s define a central place to create our actors
and store all of our mailboxes. Also, mailboxes should have an address, let’s do this by naming our
actors / mailboxes.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConcurrentLinkedQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ActorRef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;tell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;offer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getLetter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;poll&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getLetterCount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mailbox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorSystem&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;registry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HashMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Consumer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;registry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getLetterCount&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getLetter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;lookup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;registry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Modeling this off of Akka, we now have an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ActorRef&lt;/code&gt; which wraps the mailbox and an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ActorSystem&lt;/code&gt; that tracks
all of the actors in our system and also creates some easier utilities for creating actors. We can now define
actors in our system as&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;ActorSystem&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;echoActor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;echo&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;echoActor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;tell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;and we can handle communication between two named actors as&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;ActorSystem&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ActorSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ping&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ping&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sMsg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sMsg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ping&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ping&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;lookup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pong&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;ifPresent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pong&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pong&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;tell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pong&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pong&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pong&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sMsg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sMsg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pong&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pong&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;lookup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ping&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;ifPresent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ActorRef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;tell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ping&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Sweet! Now we have two actors that can look each other up and communicate back and forth endlessly.
Not that this is a useful example, but it shows out our API improvements work.&lt;/p&gt;

&lt;p&gt;Of course you can continue adding little improvements like this until you are eventually building
a full actor implementation (which you shouldn’t do). So this brings us to our next question.&lt;/p&gt;

&lt;h2 id=&quot;should-you-do-this&quot;&gt;Should You Do This?&lt;/h2&gt;

&lt;p&gt;So we’ve seen how we can create some really bare-bones actors but the question really is, “is it
worth it?” The answer to this question depends on what you’re doing. If all you need is some very simple
concurrency within your library, then this solution is fantastic as it’s zero-dependency. However if
you are performing very complex concurrent tasks that require a lot of coordination or cooperation, then
using a more full-featured framework may be to your benefit. The title did say this was a “poor man’s”
implementation, which means we’re missing &lt;em&gt;many&lt;/em&gt; of the feature that would come in a typical actor
framework / library.&lt;/p&gt;

&lt;p&gt;And actually, if you take a look at Akka (a popular Actor framework on the JVM), you’ll notice that the
dependency tree is surprisingly small. So, if you &lt;em&gt;must&lt;/em&gt; require all the power of a full-blown actor
implementation, at least it’s not bloating your dependency tree &lt;em&gt;too&lt;/em&gt; much.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;sbt&amp;gt; akka-actor/dependencyGraph

             +-------------------+
             |akka-actor_2.11 [S]|
             | com.typesafe.akka |
             |   2.4-SNAPSHOT    |
             +-------------------+
                |          |
                |          -------------
                |                      |
                v                      v
  +---------------------------+ +------------+
  |scala-java8-compat_2.11 [S]| |   config   |
  |  org.scala-lang.modules   | |com.typesafe|
  |           0.7.0           | |   1.3.0    |
  +---------------------------+ +------------+&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

</description>
        <pubDate>Thu, 31 Mar 2016 00:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2016/03/31/Poor-Mans-Actors.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2016/03/31/Poor-Mans-Actors.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Typed PATCH</title>
        <description>&lt;p&gt;When building web services we need to define a contract of how the service
will operate and how the client should communicate with the service. One important
piece to this is the data that the service returns (usually on read operations)
and the data the service expects to receive (usually on write operations). One
really fantastic way to do this, especially when working in a language like Scala,
is to use types.&lt;/p&gt;

&lt;p&gt;If I were designing a simple service to manage contacts, I might define my type
to look like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Long&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;         &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;birthday&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;kt&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;        &lt;span class=&quot;kt&quot;&gt;Email&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;      &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;createdOn&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;lastModified&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This type accurately represents what I believe a contact, in the context of my
API, is defined as. All pieces except &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;address&lt;/code&gt; are required
and I also expect a few meta-data fields to exist such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt;,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createdOn&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastModified&lt;/code&gt;. This type works great when defining objects
in my system, but it starts to break down as a definition for a contract with a
consumer of my web-service.&lt;/p&gt;

&lt;p&gt;While this works decently well for read operations, where the full object
is returned, what does this look like for a create (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt;) operation? To start I
no longer need any of what I’ll call &lt;em&gt;“system provided”&lt;/em&gt; fields such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt;,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createdOn&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastModified&lt;/code&gt;. Some of you might be saying one of two things right
about now:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Default the fields to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Make fields that aren’t required an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m going to stop you right now. The purpose of this type is &lt;em&gt;supposed&lt;/em&gt; to be a way
to expose a contract to the user. Making fields that will &lt;em&gt;always&lt;/em&gt; exist on reads
an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option&lt;/code&gt; is really just a lie and not very useful for defining a complete contract.
To truly use types as our contract here, we need to define a create-specific type.
In our case, it might look like:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserCreate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;birthday&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;Email&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This gets us where we want to be at the price of having to create and maintain another
type in our application.&lt;/p&gt;

&lt;p&gt;Now it’s time to think about how we would support operations such as PATCH which
are based around the idea of partial edits. Since, by the nature of partial edits,
everything is optional you can see that we can’t use the same model that we used
for create. Also, since we will need to know the difference between null and absent,
we’ll need to use a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TriState&lt;/code&gt; value to represent any types that are currently
nullable (or non-required by our default model).&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserCreate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;Long&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;birthday&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Email&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;TriState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;In the above model, we assume &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option&lt;/code&gt; to be a matter of presence (not nullability) and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TriState&lt;/code&gt; to represent both presence and nullability.&lt;/p&gt;

&lt;p&gt;Ta-da! We now have models that represent create, read, and partial edit. With this, we can
now work on optimizing our workflow. I think the proper step is to define an
abstract language that can define our service contract and allow our tooling to
generate our corresponding models for us. As a matter of fact, this is what we do
in Fireglass (an internal web-service framework) used at my current employment.&lt;/p&gt;

&lt;p&gt;However, this framework is not (yet, maybe someday) open source. After some quick
looking around, I came across an older project that aimed to solve the problem via
macros. While I don’t necessarily agree with the approach, it is a solution that is
available today.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/pathikrit/metarest&quot;&gt;https://github.com/pathikrit/metarest&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 29 Nov 2015 12:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2015/11/29/Typed-PATCH.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2015/11/29/Typed-PATCH.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Web Service Data Models - Null</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;This relates to my other post “&lt;a href=&quot;/log/2015/04/28/Play-Typed-Action.html&quot;&gt;Typed Actions In Play&lt;/a&gt;”. You may want to
skim it to understand my aim in all this madness.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m on quest. I am attempting to create some abstractions that allow me to work
solely with well-typed models for the purpose of developing web services. I am primarily
working in JSON which means I just need to come up with a sound data-model for the
JSON that I expect to send/receive to/from the web-service clients. Sounds like a
fairly easy task, yes? Well, sadly it is not.&lt;/p&gt;

&lt;h3 id=&quot;living-with-null&quot;&gt;Living with Null&lt;/h3&gt;

&lt;p&gt;Null values in JSON are a very interesting thing to represent in Scala. While Scala
does have the concept of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;, it seems primarily as a way to survive interop with
Java, where using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; is very common. However the conventional wisdom in the Scala
community is to replace &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option[T]&lt;/code&gt; for some type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt; that is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;‘able.
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;T&lt;/code&gt; can then be represented as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Some[T]&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt;. This makes a lot of sense, but it
fails to meet the requirements for JSON in the context of web services, and we’ll see
why.&lt;/p&gt;

&lt;p&gt;Let’s assume that we’re going to build a service to manage users. The JSON to represent
a user may look like this&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;John Murray&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;my-email@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;userName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;johnmurray_io&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Let’s assert that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;userName&lt;/code&gt; can be, in the JSON, either a string value or a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;
value. Let’s further assert that if the user does not provide this in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST&lt;/code&gt; JSON
that it defaults to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; value.&lt;/p&gt;

&lt;p&gt;For editing the object, let’s assume that we accept partial edits over &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUT&lt;/code&gt; and/or
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATCH&lt;/code&gt; (depending on which philosophy you subscribe to). This means that I do not
have to supply the full JSON object, only the fields that I wish to edit. This is a
very common practice in web services.&lt;/p&gt;

&lt;p&gt;If I were only looking at the requirements for object creation, then I might define my
model like so&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;userName&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;and the previous data would translate into&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;John Murray&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;my-email@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Some&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;johnmurray_io&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;However, this model does not meet all of our requirements, only those for object creation.
Specifically what happens when I send in the following, partial update&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;John M. Murray&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;my-other-email@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;This translates into our model as being&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;John M. Murray&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;my-other-email@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You can easily see where the breakdown is. Because we do not have a value for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;userName&lt;/code&gt;
it has no other choice than to be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt;. We are conflating the absence of a value with
the value being &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;. In the case that the value is absent on an edit operation, the user
does not &lt;em&gt;intend&lt;/em&gt; to edit the field. This means that we cannot reliably set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;userName&lt;/code&gt;
field to an empty value, &lt;em&gt;ever&lt;/em&gt;. To solve this we can introduce the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TriState[T]&lt;/code&gt; type.&lt;/p&gt;

&lt;h3 id=&quot;introducing-the-tristatet&quot;&gt;Introducing the TriState[T]&lt;/h3&gt;

&lt;p&gt;As we have seen, we are in need of a type that can represent more than the two states
provided by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option[T]&lt;/code&gt;. To handle this, we’re going to introduce a new type called
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TriState[T]&lt;/code&gt; whose name we’re borrowing from the world of electrical engineering. See
this article on &lt;a href=&quot;http://en.wikipedia.org/wiki/Three-state_logic&quot;&gt;three-state-logic&lt;/a&gt; for more details.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;trait&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TriState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TriState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Present&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TriState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Absent&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TriState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Null&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TriState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Nothing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;If we now replace the type of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;userName&lt;/code&gt; of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option[T]&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TriState[T]&lt;/code&gt;, we can properly
represent the edit JSON in our model as:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nc&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;John M. Murray&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;my-other-email@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;TriState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;Absent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;From this, we know not to edit the field, since it is absent. Additionally if I were to
provide a null value on edit, we would know to set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;userName&lt;/code&gt; to  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;/empty within
our persistent storage solution. From this we can see that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Option&lt;/code&gt;, for web services, is
better replaced with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TriState&lt;/code&gt;.&lt;/p&gt;

</description>
        <pubDate>Mon, 04 May 2015 12:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2015/05/04/Web-Service-Data-Models-Null.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2015/05/04/Web-Service-Data-Models-Null.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Typed Actions in Play</title>
        <description>&lt;p&gt;This is just something I was playing around with when discussing how to build
proper tooling for our teams at work. Play has the idea of an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Action&lt;/code&gt; which
is basically a function that takes a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Request&lt;/code&gt; object and returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Result&lt;/code&gt;
object. Each of those can be parameterized for the content type being transmitted.&lt;/p&gt;

&lt;p&gt;However, when you’re working in an API, you typically work with some exchange format
(e.g. JSON) and then serialize and de-serialize to/from your internal data model. If
you are using Scala, then possibly some case classes. Rather than having to worry
about the exchange format, developers should really just worry about these data-models
when writing their code.&lt;/p&gt;

&lt;p&gt;So, just the result of me playing with the idea for a few minutes:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TypedAction&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;TypedAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;A&lt;/span&gt;,&lt;span class=&quot;kt&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;implicit&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Reads&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Writes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BodyParsers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;tolerantText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;nv&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;successful&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;badRequest&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Results&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;BadRequest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Could not parse input&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;asOpt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;toJson&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Results&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;Ok&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;getOrElse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;badRequest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;TypedAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;implicit&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Writes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BodyParsers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;tolerantText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nv&quot;&gt;Future&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;successful&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;Results&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;Ok&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;toJson&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And then using the model&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserModel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;implicit&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;reads&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;reads&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;implicit&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;writes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;writes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We can create a controller that looks like&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-scala&quot; data-lang=&quot;scala&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;object&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserController&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Controller&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;userStore&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Joe Schmoe&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Susy Jane&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Jenny Jackson&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getUser&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TypedAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;userStore&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;storeUser&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TypedAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;UserModel&lt;/span&gt;, &lt;span class=&quot;kt&quot;&gt;UserModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;userIn&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;nextKey&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;userStore&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;userStore&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nextKey&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;userIn&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;userIn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;py&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nextKey&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;We could also create different input and output models within the same
controller method. In addition, if you really wanted to do something like
this you would need to handle errors much better, both from the user code
and from the parsing code. I’m also not really doing anything with the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Action.async&lt;/code&gt; portion above, so that could be improved as well.&lt;/p&gt;

&lt;p&gt;But yeah, just some (light) food for thought.&lt;/p&gt;
</description>
        <pubDate>Tue, 28 Apr 2015 12:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2015/04/28/Play-Typed-Action.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2015/04/28/Play-Typed-Action.html</guid>
        
        
        <category>log</category>
        
      </item>
    
      <item>
        <title>Jenkins EnvVar Templating</title>
        <description>&lt;p&gt;I’ve been doing a bit of Jenkins plugin development lately and I have
found that documentation can be a bit scarce. Like many projects out
there, they show you how to drive a nail and then expect you to go off
and build a house. I’m posting a little bit of what I have created in
hopes of either sharing some much needed documentation or being shown
a better way to do things.&lt;/p&gt;

&lt;p&gt;While building my plugin I needed a way to inject Jenkins environment
variables, called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EnvVars&lt;/code&gt; in Jenkins API into some input. Not being
able to find any built-in utilities to do this, I wrote my own. So,
without further to-do, a util that has been useful (for met at least):&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;hudson.EnvVars&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.regex.Matcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.regex.Pattern&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EnvTemplater&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pattern&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;VARIABLE_PATTERN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pattern&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;(\\$\\{?[A-Za-z_]+\\}?)&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pattern&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;VARIABLE_NAME_PATTERN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Pattern&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;([A-Za-z_]+)&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/**
     * Given an input string, find environment var patterns and inject them into
     * the string from the current environment variables. The input of the string really
     * isn&apos;t important to this function, only the format of the variables within the string.
     * We look for two forms of variables:
     *  - $VAR_NAME
     *  - ${VAR_NAME}
     *
     * Note: The environment variables that we are using are not _true_ environment
     * variables, but rather Jenkins Environment variables (the same ones you would normally
     * use to template within a normal Jenkins job).
     *
     * @param input The input string to be templated (possibly containing variable
     *              expressions)
     * @param vars  The vars to use to inject into the input string
     * @return      A string where the variables have been replaced by Jenkins evn variable
     *              value, if the variable exists.
     */&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;templateString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;EnvVars&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;vars&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vars&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;Matcher&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;match&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;VARIABLE_PATTERN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;matcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;replacementOffset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// iterate through all of the variables that we find&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// find the variable name (without the $ and {} characters)&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matchGroup&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;Matcher&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;varNameMatcher&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;VARIABLE_NAME_PATTERN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;matcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matchGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;varNameMatcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// pull out variable name, replace using bounds of outer `match`&lt;/span&gt;
                &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;varNameMatchGroup&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;varNameMatcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;startPos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endPos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vars&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;containsKey&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;varNameMatchGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;replacement&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;vars&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;varNameMatchGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matchGroup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;replacementOffset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;startPos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                            &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;replacement&lt;/span&gt;
                            &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replacementOffset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;endPos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;

                    &lt;span class=&quot;c1&quot;&gt;// replacement offset is used during string replacement to account for&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// the string growing or shrinking as we replace values (and the regex&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// positions being out of date).&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;replacementOffset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;replacement&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;endPos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;startPos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

</description>
        <pubDate>Mon, 27 Apr 2015 12:00:00 +0000</pubDate>
        <link>http://www.johnmurray.io/log/2015/04/27/Jenkins-Env-Templating.html</link>
        <guid isPermaLink="true">http://www.johnmurray.io/log/2015/04/27/Jenkins-Env-Templating.html</guid>
        
        
        <category>log</category>
        
      </item>
    
  </channel>
</rss>
