<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Koncepto Sociala</title>
    <subtitle>Little blog for programming and life</subtitle>
    <link rel="self" type="application/atom+xml" href="https://konceptosociala.eu.org/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://konceptosociala.eu.org"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-12T00:00:00+00:00</updated>
    <id>https://konceptosociala.eu.org/atom.xml</id>
    <entry xml:lang="en">
        <title>What I have made during the summer</title>
        <published>2026-07-12T00:00:00+00:00</published>
        <updated>2026-07-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://konceptosociala.eu.org/blog/why-i-rebuilt-my-blog/"/>
        <id>https://konceptosociala.eu.org/blog/why-i-rebuilt-my-blog/</id>
        
        <content type="html" xml:base="https://konceptosociala.eu.org/blog/why-i-rebuilt-my-blog/">&lt;p&gt;&lt;strong&gt;Xide (Java, Kotlin)&lt;&#x2F;strong&gt;: I&#x27;ve decided to replace RSyntaxTextArea completely (it takes much more time, but I guess it worth it), because it was primarily developed for conservative old school IDEs like eclipse, not really suitable for LSPs or tree sitter, so I am making editor from scratch, using Piece Table optimization. The next step will be text selection and syntax highlighting. I also added Kotlin support to my project and now all the plugins are or will be written in Kotlin. I am also still fighting with the style, I think that the previous version is too dark for every monitor, so I am sticking to GitHub Dark FlatLaf theme, looks nice (but not for ever :))&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;XastC (Haskell)&lt;&#x2F;strong&gt;: Xast programming language compiler, now I am on semantic analysis stage – name resolution, import resolution, Hindley Milner type inference are implemented almost, but the hardest part is going further – many optimizations (CoW, unique types, compile time expressions, and so on, and so on....) as well as desugaring and maybe even more syntax sugar to make the language usable for big projects. Semantics are still in development.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;XastGE (Rust)&lt;&#x2F;strong&gt;: I fully replaced my half-OOP libGDX-like architecture with World storage, with fully ECS based approach - Flecs modules, systems and sometimes compiled queries. I also added simple UI (text rendering with automatic layout and tweening hover animations) and C Flecs shared .so plugins support, so I could later write my game logic in Xast, compiling it to C and using it as plugins for my engine. Now it is being developed and scaled much more naturally and easily!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Carol (former Java, now Vala)&lt;&#x2F;strong&gt;: Yes, it is really strange idea to fully migrate from feature rich and big ecosystem language like Java, with libGDX framework to a language, which was made for GTK (Linux GUI toolkit) apps and has literally no game engines and frameworks... But it is really fun, because this language looks a lot like Java&#x2F;C#, but is compiled to C, so, without GC (but sometimes with reference counting), VM, very fast compilation and near C performance. And it just looks fun. And also libGDX just broke my X11 WM because of, idk really what, but maybe old LWJGL version, used because of Nifty GUI (cool lib though). But nevertheless, I am not sure, when I&#x27;ll continue developing this concrete game (I almost fully transferred it from Java to Vala), because I don&#x27;t really know, what it must become, and what the story should be about, so... We&#x27;ll see :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>MVU Pattern and Functional Approach in Flutter</title>
        <published>2025-12-08T00:00:00+00:00</published>
        <updated>2025-12-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://konceptosociala.eu.org/tutorials/mvu-pattern-flutter/"/>
        <id>https://konceptosociala.eu.org/tutorials/mvu-pattern-flutter/</id>
        
        <content type="html" xml:base="https://konceptosociala.eu.org/tutorials/mvu-pattern-flutter/">&lt;p&gt;When learning Flutter, its view-state management is straightforward at first glance: you create your own widget classes and use anonymous functions as callbacks directly in the view, where you use built-in &lt;code&gt;setState(...)&lt;&#x2F;code&gt; function to change a state inside this widget. But as the project grows, you can face some problems using this approach:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Synchronization of state and presentation&lt;&#x2F;strong&gt;. When you change some value in one place, which should change a presentation (view) in another place, when your widget depends on another widget&#x27;s state, when and how should you call your &lt;code&gt;setState(...)&lt;&#x2F;code&gt;?&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Correct event handling&lt;&#x2F;strong&gt;. When some event happens in one widget, how would you handle execution of the next one? And moreover, if the next event should happen in another widget, and even more is &lt;code&gt;async&lt;&#x2F;code&gt;, how will you preserve the execution order?&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multiple widgets — multiple states&lt;&#x2F;strong&gt;. If one widget&#x27;s state depends on another one, for example, some page&#x27;s state depends on the root widget&#x27;s state or even on another page, how will you synchronize it? Borrowing mutable references of a widget state or a part of it is the most common approach in Flutter, because objects are passed by mutable references there. For example, borrowing &lt;code&gt;Post&lt;&#x2F;code&gt;s from some &lt;code&gt;Blog&lt;&#x2F;code&gt; page for each &lt;code&gt;PostPreview&lt;&#x2F;code&gt; widget, so every &lt;code&gt;PostPreview&lt;&#x2F;code&gt; will contain a reference to its corresponding post. But it&#x27;s really error-prone in big projects with a lot of widgets and states, see the points above.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;It is not the only Flutter&#x27;s problem, a lot of frameworks, which are worse designed, are even harder to handle. However, there is a quite simple solution, which would work well even on big projects and is well presented in the Elm framework and programming language — &lt;strong&gt;MVU pattern&lt;&#x2F;strong&gt;, along with some functional approach, which will make your project even less error-prone.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-mvu&quot;&gt;What is MVU?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;MVU&lt;&#x2F;strong&gt; (acronym for &lt;strong&gt;Model-View-Update&lt;&#x2F;strong&gt;) is a simple pattern which uses the simple algorithm:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We have an initial &lt;strong&gt;model&lt;&#x2F;strong&gt;, a global collection of data, used in our application, which we initialize at the beginning of the program. If its structure becomes too big, we can split it into modules, as it&#x27;s done in Elm.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;We have our &lt;strong&gt;view&lt;&#x2F;strong&gt; — a root widget, which is built from smaller widgets which we can interact with.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;When we interact with our view, e.g. clicking button, writing text etc., we send some &lt;code&gt;Msg&lt;&#x2F;code&gt; — &quot;tagged union&quot;-based event data structure, which is then processed in a special &lt;code&gt;update&lt;&#x2F;code&gt; function, that will return a new version of our model and build a new view with respect to the new model.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;mvu-flutter&#x2F;img1.svg&quot; alt=&quot;MVU demonstration&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Advantages of this approach are obvious: we don&#x27;t care about state management at all, we just send a specific &lt;code&gt;Msg&lt;&#x2F;code&gt; for each specific action and process it in an &lt;code&gt;update&lt;&#x2F;code&gt; function, changing the model, which automatically updates the view as needed.&lt;&#x2F;p&gt;
&lt;p&gt;And the most pleasant is the thing, that we can easily implement it in Flutter, without difficult project architecture, and I&#x27;ll show you how. Let&#x27;s go!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;simple-and-pure-counter-project&quot;&gt;Simple and &lt;em&gt;pure&lt;&#x2F;em&gt; counter project&lt;&#x2F;h2&gt;
&lt;p&gt;Like most UI frameworks tutorials, and especially MVU-based ones, we will start with a simple counter project. I call it &lt;em&gt;pure&lt;&#x2F;em&gt;, because for now our application logic will not contain any side effects and will only affect the inner state of a program: increment&#x2F;decrement a number.&lt;&#x2F;p&gt;
&lt;p&gt;Firstly, we need to create our main &lt;code&gt;MVU&lt;&#x2F;code&gt; widget, which will be a skeleton for our program. Let&#x27;s create some auxiliary types and an &lt;code&gt;MVU&lt;&#x2F;code&gt; class:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;typedef&lt;&#x2F;span&gt;&lt;span&gt; Update&amp;lt;M, Msg&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; M Function(M model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Msg msg)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;typedef&lt;&#x2F;span&gt;&lt;span&gt; View&amp;lt;M, Msg&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Widget Function(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  M model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  void&lt;&#x2F;span&gt;&lt;span&gt; Function(Msg msg) dispatch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span&gt; MVU&amp;lt;M, Msg&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; extends&lt;&#x2F;span&gt;&lt;span&gt; StatefulWidget {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; M initialModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; Update&amp;lt;M, Msg&amp;gt; update&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; View&amp;lt;M, Msg&amp;gt; view&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span&gt; MVU({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    super&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;initialModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;update&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;view&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  })&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;  @override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  MVUState&amp;lt;M, Msg&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; createState&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; MVUState&amp;lt;M, Msg&amp;gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Here we change our state based on the dispatched Msg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span&gt; MVUState&amp;lt;M, Msg&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; extends&lt;&#x2F;span&gt;&lt;span&gt; State&amp;lt;MVU&amp;lt;M, Msg&amp;gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  late&lt;&#x2F;span&gt;&lt;span&gt; M model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;  @override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; initState&lt;&#x2F;span&gt;&lt;span&gt;() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    super&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;initState&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    model &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;initialModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(Msg msg) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    final&lt;&#x2F;span&gt;&lt;span&gt; newModel &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; msg)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    setState&lt;&#x2F;span&gt;&lt;span&gt;(() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      model &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; newModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    })&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;  @override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; build&lt;&#x2F;span&gt;&lt;span&gt;(BuildContext context) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;(model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; dispatch)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now we will create our &lt;code&gt;Model&lt;&#x2F;code&gt; and &lt;code&gt;Msg&lt;&#x2F;code&gt;. Because the first is immutable, and the second is actually an ADT, we will use &lt;code&gt;freezed&lt;&#x2F;code&gt; package for this.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;package:freezed_annotation&#x2F;freezed_annotation.dart&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;part&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;model.freezed.dart&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;@freezed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;abstract class&lt;&#x2F;span&gt;&lt;span&gt; Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; with&lt;&#x2F;span&gt;&lt;span&gt; _$Model {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span&gt; Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;_()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;  &#x2F;&#x2F; Declare our fields here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; factory&lt;&#x2F;span&gt;&lt;span&gt; Model({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    required&lt;&#x2F;span&gt;&lt;span&gt; int value&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; _Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;  &#x2F;&#x2F; Initial state&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;  factory&lt;&#x2F;span&gt;&lt;span&gt; Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;initial&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Model(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;package:flutter&#x2F;foundation.dart&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;package:freezed_annotation&#x2F;freezed_annotation.dart&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;part&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;msg.freezed.dart&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;@freezed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;sealed class&lt;&#x2F;span&gt;&lt;span&gt; Msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; with&lt;&#x2F;span&gt;&lt;span&gt; _$Msg {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; factory&lt;&#x2F;span&gt;&lt;span&gt; Msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;increment&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; Increment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; factory&lt;&#x2F;span&gt;&lt;span&gt; Msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;decrement&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; Decrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Variants of our &lt;code&gt;Msg&lt;&#x2F;code&gt; can also have fields, so we can pass some data sending events, but for our application it is not needed. Also, do not forget to add &lt;code&gt;build_runner&lt;&#x2F;code&gt; package to dependencies and run &lt;code&gt;dart run build_runner watch -d&lt;&#x2F;code&gt; to generate freezed files.&lt;&#x2F;p&gt;
&lt;p&gt;Then we initialize our application and main widget, containing the &lt;code&gt;MVU&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; runApp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; AppRoot())&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span&gt; AppRoot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; extends&lt;&#x2F;span&gt;&lt;span&gt; StatelessWidget {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span&gt; AppRoot({&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;super&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;key})&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;  @override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; build&lt;&#x2F;span&gt;&lt;span&gt;(BuildContext context) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; MVU&amp;lt;Model, Msg&amp;gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    initialModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;initial&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    update&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; update&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    view&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; view&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the &lt;code&gt;update&lt;&#x2F;code&gt; function, we will process our events, which are dispatched in UI. In our application it is simple for now (and pure):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; update&lt;&#x2F;span&gt;&lt;span&gt;(Model model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Msg msg) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; switch&lt;&#x2F;span&gt;&lt;span&gt; (msg) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;  &#x2F;&#x2F; Copying immutable models in `freezed` &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;  &#x2F;&#x2F; is actually cheap, unlike deep cloning&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Increment() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;copyWith&lt;&#x2F;span&gt;&lt;span&gt;(value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Decrement() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;copyWith&lt;&#x2F;span&gt;&lt;span&gt;(value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And in &lt;code&gt;view&lt;&#x2F;code&gt; we will initialize our UI, which will be based on our &lt;code&gt;Model&lt;&#x2F;code&gt; and could dispatch events with &lt;code&gt;Msg&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span&gt;(Model model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; void&lt;&#x2F;span&gt;&lt;span&gt; Function(Msg) dispatch) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; MaterialApp(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;  &#x2F;&#x2F; General stuff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  debugShowCheckedModeBanner&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;Counter MVU&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  theme&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; ThemeData&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;light&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Scaffold(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    body&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Row(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      mainAxisAlignment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; MainAxisAlignment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;center&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      crossAxisAlignment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; CrossAxisAlignment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;center&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      children&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; This button dispatches `Increment` event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        TextButton(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          onPressed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; () &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(Increment())&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          child&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Text(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;Increment&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; Here we print value from the model&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Text(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;Value: ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;}&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; This button dispatches `Decrement` event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        TextButton(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          onPressed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; () &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(Decrement())&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          child&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Text(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;Decrement&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that&#x27;s it! Now we have a pure MVU-idiomatic counter application, which we can easily extend and maintain, as each event the application sends, can and must be processed explicitly.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;mvu-flutter&#x2F;img2.svg&quot; alt=&quot;MVU application diagram&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mvu-with-nested-widgets&quot;&gt;MVU with nested widgets&lt;&#x2F;h2&gt;
&lt;p&gt;However, as the project grows, we create new widgets which don&#x27;t have direct access to our &lt;code&gt;MVUState&lt;&#x2F;code&gt; and &lt;code&gt;dispatch&lt;&#x2F;code&gt; function. How to deal with it? The answer is clear and quite Dart&#x27;ish: we just create anonymous functions, which enclosure dispatch calls for every needed &lt;code&gt;Msg&lt;&#x2F;code&gt; and then pass them to our widgets&#x27; constructors, so we can call them from there.&lt;&#x2F;p&gt;
&lt;p&gt;In our example, we will separate buttons into different widgets; it&#x27;s not very good to do this, as they are semantically similar, but it&#x27;s for an educational purpose 😊&lt;&#x2F;p&gt;
&lt;p&gt;Create two simple classes:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span&gt; IncButton&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; extends&lt;&#x2F;span&gt;&lt;span&gt; StatelessWidget {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; VoidCallback onIncrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span&gt; IncButton({&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;super&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;onIncrement})&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;  @override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; build&lt;&#x2F;span&gt;&lt;span&gt;(BuildContext context) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; TextButton(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    onPressed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; onIncrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    child&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Text(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;Increment&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span&gt; DecButton&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; extends&lt;&#x2F;span&gt;&lt;span&gt; StatelessWidget {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; VoidCallback onDecrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span&gt; DecButton({&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;super&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; required&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;onDecrement})&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;font-weight: bold;&quot;&gt;  @override&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; build&lt;&#x2F;span&gt;&lt;span&gt;(BuildContext context) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; TextButton(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    onPressed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; onDecrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    child&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; Text(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;Increment&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And pass anonymous function with a correct &lt;code&gt;dispatch&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;children&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  IncButton(onIncrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; () &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(Increment()))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Text(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;Value: ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;}&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  DecButton(onDecrement&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; () &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(Decrement()))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;side-effects-and-async&quot;&gt;Side effects and async&lt;&#x2F;h2&gt;
&lt;p&gt;But what if we want some side effects to occur, when processing our events: reading from file, printing to terminal, web requests etc.? If they are synced, we could just rewrite our &lt;code&gt;update&lt;&#x2F;code&gt; function imperatively and use side effects implicitly. However, the better way would be to use &lt;code&gt;IO&lt;&#x2F;code&gt; wrapper to explicitly show that our event can have side effects. And even better &lt;code&gt;Task&lt;&#x2F;code&gt; wrapper, because most Flutter side effects are async, so that it won&#x27;t freeze our UI.&lt;&#x2F;p&gt;
&lt;p&gt;So to introduce side effects in our MVU pattern, let&#x27;s first change the signature of our &lt;code&gt;Update&lt;&#x2F;code&gt; type alias:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Semantically means: returns `Task`, that processes model M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;typedef&lt;&#x2F;span&gt;&lt;span&gt; Update&amp;lt;M, Msg&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Task&amp;lt;M&amp;gt; Function(M model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Msg msg)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and dispatch method inside &lt;code&gt;MVU&lt;&#x2F;code&gt; widget:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Changed to async context&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;void&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(Msg msg) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;  &#x2F;&#x2F; Added .run() to execute `Task`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; newModel &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; await&lt;&#x2F;span&gt;&lt;span&gt; widget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; msg)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;  setState&lt;&#x2F;span&gt;&lt;span&gt;(() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    model &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; newModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  })&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For example, let&#x27;s add some side effects to the &lt;code&gt;Increment&lt;&#x2F;code&gt; event to save some data using &lt;code&gt;SharedPreferences&lt;&#x2F;code&gt;. For this we should add a new variant &lt;code&gt;SaveData(int data)&lt;&#x2F;code&gt; to &lt;code&gt;Msg&lt;&#x2F;code&gt; and use &lt;code&gt;Task&lt;&#x2F;code&gt; or &lt;code&gt;Task.Do&lt;&#x2F;code&gt; (which is actually more useful in TaskEither.Do). To evoke an event from another event, we can simply call the &lt;code&gt;update&lt;&#x2F;code&gt; function with the new model and the needed &lt;code&gt;Msg&lt;&#x2F;code&gt;. But in the &lt;code&gt;Task&lt;&#x2F;code&gt; context, it is more interesting:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; We return Task instead of a raw Model&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Task&amp;lt;Model&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; update&lt;&#x2F;span&gt;&lt;span&gt;(Model model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Msg msg) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; switch&lt;&#x2F;span&gt;&lt;span&gt; (msg) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Increment() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Task&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Do(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ($) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      &#x2F;&#x2F; Compute a new model&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;      final&lt;&#x2F;span&gt;&lt;span&gt; newModel &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;copyWith&lt;&#x2F;span&gt;&lt;span&gt;(value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      &#x2F;&#x2F; Return the result of the `SaveData` event with `$`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      &#x2F;&#x2F; (we will talk about `$` later)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(newModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; SaveData(model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;value)))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Decrement() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Task&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;of&lt;&#x2F;span&gt;&lt;span&gt;(model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;copyWith&lt;&#x2F;span&gt;&lt;span&gt;(value&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;value &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  SaveData(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;final&lt;&#x2F;span&gt;&lt;span&gt; data) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Task&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Do(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ($) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      &#x2F;&#x2F; Do some async stuff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;      final&lt;&#x2F;span&gt;&lt;span&gt; pref &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; await&lt;&#x2F;span&gt;&lt;span&gt; SharedPreferences&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;getInstance&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;      await&lt;&#x2F;span&gt;&lt;span&gt; pref&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;setInt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;quot;counter&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; data)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      &#x2F;&#x2F; Return model as is, because we haven&amp;#39;t done any computation here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;mvu-flutter&#x2F;img3.svg&quot; alt=&quot;MVU with side effects&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You might notice that the &lt;code&gt;Do&lt;&#x2F;code&gt; and the &lt;code&gt;$&lt;&#x2F;code&gt; operator are implementation of the monad &lt;code&gt;do-notation&lt;&#x2F;code&gt; borrowed from Haskell:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Do&lt;&#x2F;code&gt; is a syntax sugar to present monad consecutive computation in a imperative way;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;$&lt;&#x2F;code&gt; is actually a function which is almost an analogue of the &lt;code&gt;&amp;lt;-&lt;&#x2F;code&gt; operator in Haskell: it &quot;unwraps&quot; a context, some mysterious box, where the value is hidden, and returns it, if it is available, to continue computation. With a &lt;code&gt;Task&lt;&#x2F;code&gt; semantics, it is like: &lt;em&gt;&quot;if the value is computed asynchronously — get it and pass forward, if not yet — wait, if it is failed — stop computation.&quot;&lt;&#x2F;em&gt; We will discuss this stuff below.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;more-functional-features-option-either-taskeither&quot;&gt;More functional features: Option, Either, TaskEither&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;code&gt;$&lt;&#x2F;code&gt; operator is more useful and, what is more important, understandable in contexts like &lt;code&gt;Option&lt;&#x2F;code&gt; — context with &quot;optional value&quot; semantics or &lt;code&gt;Either&lt;&#x2F;code&gt; — context with &quot;value or error&quot; semantics.&lt;&#x2F;p&gt;
&lt;p&gt;For example, say we have two functions: one, which returns a reciprocal of a number, and another, which returns a square root. First of all, how do we handle situations where these functions are not defined? We can do it implicitly by throwing an exception, but we should specify all error cases in documentation, which not everyone does. Also, we can return something like &lt;code&gt;-1&lt;&#x2F;code&gt; value, but, again, without proper documentation it can still cause a lot of errors. In Flutter, we can return a nullable type, and it is better. &lt;code&gt;fpdart&lt;&#x2F;code&gt;&#x27;s &lt;code&gt;Option&lt;&#x2F;code&gt; type is the same as nullable, but with the possibility to be used in consecutive (monadic) computations.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s write these functions:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocal&lt;&#x2F;span&gt;&lt;span&gt;(double n) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (n &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; None()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span&gt; Some(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span&gt; n)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; root&lt;&#x2F;span&gt;&lt;span&gt;(double n) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (n &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; None()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span&gt; Some(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;sqrt&lt;&#x2F;span&gt;&lt;span&gt;(n))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or in more functional way using pattern matching:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocal&lt;&#x2F;span&gt;&lt;span&gt;(double n) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; switch&lt;&#x2F;span&gt;&lt;span&gt; (n) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;  0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; None()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  _ &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Some(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span&gt; n)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; root&lt;&#x2F;span&gt;&lt;span&gt;(double n) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; switch&lt;&#x2F;span&gt;&lt;span&gt; (n) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; invalid &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;when&lt;&#x2F;span&gt;&lt;span&gt; invalid &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    None()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; other &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Some(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;sqrt&lt;&#x2F;span&gt;&lt;span&gt;(other))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And then, what will be the &lt;strong&gt;composition&lt;&#x2F;strong&gt; of these functions? Obviously, it is a &quot;reciprocal root&quot; of a number, but what would it look like in code?&lt;&#x2F;p&gt;
&lt;p&gt;We can simply check the return value of each function like null-checking in Java:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocalRoot&lt;&#x2F;span&gt;&lt;span&gt;(double n) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  final&lt;&#x2F;span&gt;&lt;span&gt; x &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; root&lt;&#x2F;span&gt;&lt;span&gt;(n)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;isSome&lt;&#x2F;span&gt;&lt;span&gt;()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    final&lt;&#x2F;span&gt;&lt;span&gt; y &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocal&lt;&#x2F;span&gt;&lt;span&gt;(x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;toNullable&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  } &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; None()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But what if we had 10 optional computations, how many nested brackets would we get? The question is rhetorical 😅&lt;&#x2F;p&gt;
&lt;p&gt;To avoid it, we can use an approach which we&#x27;d use in Rust dealing with consecutive &lt;code&gt;Option&lt;&#x2F;code&gt;s — &lt;code&gt;and_then&lt;&#x2F;code&gt;. While writing this post, I found out that &lt;code&gt;fpdart&lt;&#x2F;code&gt; analogue of &lt;code&gt;and_then&lt;&#x2F;code&gt; is &lt;code&gt;flatMap&lt;&#x2F;code&gt;, while &lt;code&gt;andThen&lt;&#x2F;code&gt; is a really different function, but &lt;em&gt;whatever&lt;&#x2F;em&gt; 😁&lt;&#x2F;p&gt;
&lt;p&gt;It would look like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocalRoot&lt;&#x2F;span&gt;&lt;span&gt;(double n) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;  root&lt;&#x2F;span&gt;&lt;span&gt;(n)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;flatMap&lt;&#x2F;span&gt;&lt;span&gt;((value) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocal&lt;&#x2F;span&gt;&lt;span&gt;(value))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Much better. Now even having multiple steps, everything will be linear, without nested brackets. But we can go even further — use a functional approach in an imperative way, even if it sounds paradoxical. This is where do-notation comes in. We can write our &lt;code&gt;Option&lt;&#x2F;code&gt;-computations as a sequence of imperative commands, &quot;unwrapping&quot; values for the next computation using the previously defined &lt;code&gt;$&lt;&#x2F;code&gt; operator:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocalRoot&lt;&#x2F;span&gt;&lt;span&gt;(double n) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Option&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Do(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ($) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    final&lt;&#x2F;span&gt;&lt;span&gt; x &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span&gt;(n))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    final&lt;&#x2F;span&gt;&lt;span&gt; y &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;reciprocal&lt;&#x2F;span&gt;&lt;span&gt;(x))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;or more simply, without a redundant binding:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option&amp;lt;double&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; reciprocalRoot&lt;&#x2F;span&gt;&lt;span&gt;(double n) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Option&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Do(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ($) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    final&lt;&#x2F;span&gt;&lt;span&gt; x &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;root&lt;&#x2F;span&gt;&lt;span&gt;(n))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;reciprocal&lt;&#x2F;span&gt;&lt;span&gt;(x))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;$&lt;&#x2F;code&gt; here does exactly the same as in a &lt;code&gt;Task&lt;&#x2F;code&gt; case: &lt;em&gt;&quot;if a value exists — get it and pass it forward, otherwise — stop the computation&quot;&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;mvu-flutter&#x2F;img5.svg&quot; alt=&quot;Option demonstration&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Either&lt;&#x2F;code&gt; is similar to &lt;code&gt;Option&lt;&#x2F;code&gt;, but instead of &lt;code&gt;None&lt;&#x2F;code&gt;, we can indicate some &quot;erroneous&quot; computation with a custom error type — &lt;code&gt;String&lt;&#x2F;code&gt;, some ADT etc. &lt;code&gt;TaskOption&lt;&#x2F;code&gt; and &lt;code&gt;TaskEither&lt;&#x2F;code&gt; are async wrappers for optional and erroneous types which indicate: &lt;em&gt;&quot;this function describes an async computation with effects which may fail&quot;&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This is really useful in handling consecutive web requests. Here are some examples from my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;konceptosociala&#x2F;frago&quot;&gt;Frago&lt;&#x2F;a&gt; project: one with do-notation:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TaskEither&amp;lt;LoginError, String&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; pollForToken&lt;&#x2F;span&gt;&lt;span&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  required&lt;&#x2F;span&gt;&lt;span&gt; String clientId&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;  required&lt;&#x2F;span&gt;&lt;span&gt; String deviceCode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  int interval &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; TaskEither&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Do(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ($) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    await&lt;&#x2F;span&gt;&lt;span&gt; Future&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;delayed&lt;&#x2F;span&gt;&lt;span&gt;(Duration(seconds&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; interval))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    final&lt;&#x2F;span&gt;&lt;span&gt; accessTokenInfo &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; await&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;accessToken&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      clientId&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; clientId&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      deviceCode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; deviceCode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return switch&lt;&#x2F;span&gt;&lt;span&gt; (accessTokenInfo) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      Token(token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; final&lt;&#x2F;span&gt;&lt;span&gt; token) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      Error(err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; final&lt;&#x2F;span&gt;&lt;span&gt; err) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; switch&lt;&#x2F;span&gt;&lt;span&gt; (err) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        AuthPending() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;pollForToken&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          clientId&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; clientId&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          deviceCode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; deviceCode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ExpiredToken() &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; $(TaskEither&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;left&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          LoginError(kind&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; LoginErrorKind&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;expiredToken)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;        ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and one without it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;dart&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TaskEither&amp;lt;LoginError, String&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; fetchGitHubUser&lt;&#x2F;span&gt;&lt;span&gt;(String token) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; TaskEither&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;tryCatch&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    () &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;async&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; await&lt;&#x2F;span&gt;&lt;span&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      Uri&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;https:&#x2F;&#x2F;api.github.com&#x2F;user&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      headers&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;        &amp;#39;Authorization&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;token $&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;        &amp;#39;Accept&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; &amp;#39;application&#x2F;vnd.github.v3+json&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; __) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; LoginError(kind&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; LoginErrorKind&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;cannotResolve)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span&gt;((data) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; data[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;#39;login&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;! as&lt;&#x2F;span&gt;&lt;span&gt; String)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The MVU pattern offers a refreshing alternative to the traditional, often tangled approaches to state management in Flutter. By centralizing state in an immutable model and routing every change through explicit messages and an &lt;code&gt;update&lt;&#x2F;code&gt; function, MVU dramatically simplifies reasoning about how an application behaves. Instead of chasing &lt;code&gt;setState&lt;&#x2F;code&gt; calls or synchronizing multiple widget states, you work with a predictable, linear data flow that scales naturally as your project grows.&lt;&#x2F;p&gt;
&lt;p&gt;Introducing functional ideas like &lt;code&gt;Task&lt;&#x2F;code&gt;, &lt;code&gt;Option&lt;&#x2F;code&gt;, and &lt;code&gt;Either&lt;&#x2F;code&gt; further strengthens this foundation. Side effects become explicit, async workflows become easier to follow, and error handling becomes intentional rather than accidental. These tools let you write code that not only works but clearly communicates what it does and why.&lt;&#x2F;p&gt;
&lt;p&gt;Also, in this tutorial we used &lt;code&gt;freezed&lt;&#x2F;code&gt; and &lt;code&gt;fpdart&lt;&#x2F;code&gt; packages, however they are much more powerful than presented here, so you&#x27;re welcome to visit their homepages for more info:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pub.dev&#x2F;packages&#x2F;fpdart&quot;&gt;fpdart&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pub.dev&#x2F;packages&#x2F;freezed&quot;&gt;freezed&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Making a Static Blog in Elm: Why and How?</title>
        <published>2025-08-21T00:00:00+00:00</published>
        <updated>2025-08-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://konceptosociala.eu.org/tutorials/making-a-static-blog-in-elm/"/>
        <id>https://konceptosociala.eu.org/tutorials/making-a-static-blog-in-elm/</id>
        
        <content type="html" xml:base="https://konceptosociala.eu.org/tutorials/making-a-static-blog-in-elm/">&lt;p&gt;&lt;strong&gt;Warning:&lt;&#x2F;strong&gt; this post is more like a cheat sheet than a full tutorial, so you should get acquainted with some basics
of functional programming, or at least read &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;guide.elm-lang.org&#x2F;&quot;&gt;the official Elm guide&lt;&#x2F;a&gt; first.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been remaking my tech blog on GitHub Pages several times: I switched themes for Jekyll
static website generator, then moved from Jekyll to Zola, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;konceptosociala&#x2F;socio&#x2F;&quot;&gt;wrote my own Zola theme&lt;&#x2F;a&gt;, returned to Jekyll back with a simple no-style design, but it was really &lt;strong&gt;boring&lt;&#x2F;strong&gt;.
I still write my blog posts in plain old Markdown, as I did before, but I wanted to try something new and
quite captivating; however, writing my own Jekyll&#x2F;Zola theme from scratch seemed unsound, because it&#x27;s still the same HTML&#x2F;CSS&#x2F;JS, which we all &quot;love&quot; so much.&lt;&#x2F;p&gt;
&lt;p&gt;About a year ago I got acquainted with Elm. Then it seemed to me like another one &quot;compile-to-JS&quot; stuff, with a
weird syntax, but still well-known and cool MVP paradigm, like in Flutter, Relm and other declarative UI frameworks.
And now in 2025, when I got used to Haskell syntax as well as a functional programming paradigm, I clearly see
Elm as a simplified version of Haskell (what it really is), developed for web frontend. And now this website, at least as of the 21st of August, 2025, is completely written in Elm, and I&#x27;ll show you how exactly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why?&lt;&#x2F;h2&gt;
&lt;p&gt;You should use Elm for building a website for several reasons:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Strict static typing: no &lt;code&gt;null&lt;&#x2F;code&gt;, &lt;code&gt;undefined&lt;&#x2F;code&gt;, &lt;code&gt;[] + {} - &quot; &quot;&lt;&#x2F;code&gt; expressions and other undebuggable stuff — only&lt;br &#x2F;&gt;
strong and concrete data types;&lt;&#x2F;li&gt;
&lt;li&gt;Cool functional features, like immutability, pattern matching,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Algebraic_data_type&quot;&gt;ADTs&lt;&#x2F;a&gt; etc;&lt;&#x2F;li&gt;
&lt;li&gt;Reactive and modern Model-View-Update architecture, which is fast and pretty easy to use for creating
responsive applications (even a blog);&lt;&#x2F;li&gt;
&lt;li&gt;No JavaScript! You may use it only if you need some specific stuff, written in JS, which is not present in
Elm infrastructure (like highlight.js; you can read about it below).&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;how&quot;&gt;How?&lt;&#x2F;h2&gt;
&lt;p&gt;First of all, install Elm and make a basic web app setup, following &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;guide.elm-lang.org&#x2F;install&#x2F;elm.html&quot;&gt;this guide&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Now create base &lt;code&gt;index.html&lt;&#x2F;code&gt; file with the following contents:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;DOCTYPE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; html&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; charset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;UTF-8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;viewport&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;width=device-width, initial-scale=1.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;stylesheet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; href&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&#x2F;absolute&#x2F;path&#x2F;to&#x2F;css&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; src&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&#x2F;elm.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; app&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; Elm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;Main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;font-weight: bold;&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;&#x2F;strong&gt;: you should also copy your &lt;code&gt;index.html&lt;&#x2F;code&gt; contents to &lt;code&gt;404.html&lt;&#x2F;code&gt; file as your server will redirect every page to a 404 default page, which would be useful to turn out to be a copy of the app&#x27;s main page :)&lt;&#x2F;p&gt;
&lt;p&gt;In this tutorial we won&#x27;t use &lt;code&gt;elm reactor&lt;&#x2F;code&gt;, because it can&#x27;t work with html files and it will be hard to debug, imo.
Instead, I&#x27;d recommend to install &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;marketplace.visualstudio.com&#x2F;items?itemName=emeraldwalk.RunOnSave&quot;&gt;Run on Save VS Code extension&lt;&#x2F;a&gt; and write the following lines to your &lt;code&gt;.vscode&#x2F;settings.json&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #689D6A;&quot;&gt;emeraldwalk.runonsave&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #689D6A;&quot;&gt;commands&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #689D6A;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;.(elm)$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #689D6A;&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;elm make src&#x2F;Main.elm --optimize --output=elm.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now every time you save any of your Elm files, the project will be compiled to an &lt;code&gt;elm.js&lt;&#x2F;code&gt; file
and you will be able to test your app in your browser using some kind of HTTP server. I haven&#x27;t come up
with anything better than using a custom Python HTTP server, run with a simple script, which you can find
on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pastebin.com&#x2F;eGXvBERW&quot;&gt;this pastebin link&lt;&#x2F;a&gt;, as I don&#x27;t want to write the full code here.&lt;&#x2F;p&gt;
&lt;p&gt;Now let&#x27;s start coding in Elm! Start with &lt;code&gt;Model&lt;&#x2F;code&gt; and &lt;code&gt;Event&lt;&#x2F;code&gt; types, which are crucial in every Elm application:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;type alias &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Navigation key used in URL change&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span&gt; Browser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Navigation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Route to navigate through our pages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Route&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Current page content to be loaded&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Maybe&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Html&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Current title to be loaded&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Maybe&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Loaded blog post previews (like date + title + link)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; blogPosts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Maybe&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;List PostData&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;-- Different events (predominantly for data loading)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; UrlChange&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Url&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; LinkClicked&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; UrlRequest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; PostLoaded&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span&gt; Http&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Error String&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; PostsIndexLoaded&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span&gt; Http&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;List PostData&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Will be used for Highlight.js example&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; DomReady&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And let&#x27;s write some simple routes parsing:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;type &lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Route&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Home&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; About&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Blog&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Post&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; String&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; NotFound&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; String&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;routeParser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Parser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;routeParser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; oneOf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   [&lt;&#x2F;span&gt;&lt;span&gt; map&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Home&lt;&#x2F;span&gt;&lt;span&gt; top&lt;&#x2F;span&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;                   -- &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span&gt; map&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; About&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;about&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;          -- &#x2F;about&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span&gt; map&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Blog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;blog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            -- &#x2F;blog&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ,&lt;&#x2F;span&gt;&lt;span&gt; map&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Post&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;post&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; &amp;lt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt; -- &#x2F;post&#x2F;my-super-post&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;parseUrl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span&gt; Url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Route&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;parseUrl&lt;&#x2F;span&gt;&lt;span&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   parse routeParser url&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;      |&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Maybe&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;withDefault&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;NotFound&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;dropLeft&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now let&#x27;s take a look at our &lt;code&gt;main&lt;&#x2F;code&gt; function in &lt;code&gt;Main.elm&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; ()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Model Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Browser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;application&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; init&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; view&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; \&lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; title&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;            case &lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;               Just&lt;&#x2F;span&gt;&lt;span&gt; title &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;                  -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; title&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;               Nothing&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;                  -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Loading...&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; body&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;            case &lt;&#x2F;span&gt;&lt;span&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;               Just&lt;&#x2F;span&gt;&lt;span&gt; pageView&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;                  [&lt;&#x2F;span&gt;&lt;span&gt; pageView&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;               Nothing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;                  [&lt;&#x2F;span&gt;&lt;span&gt; text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Loading...&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot; ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; update&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; subscriptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; always Sub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; onUrlChange&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; UrlChange&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; onUrlRequest&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; LinkClicked&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let&#x27;s highlight the most important moments:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;view&lt;&#x2F;code&gt; function: as we get a part of our views from HTTP requests, we can&#x27;t just rely on static
view for each route like &quot;if home then view home&quot;, &quot;if post then view post&quot; etc. We will just try to
show some results, stored in the Model, which will be computed in &lt;code&gt;init&lt;&#x2F;code&gt; and &lt;code&gt;update&lt;&#x2F;code&gt; functions;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;init&lt;&#x2F;code&gt; function: there we will parse our passed URL, construct our initial Model with the data given
and check the route to perform further actions: load view directly (Home, About) or send an HTTP request
(Blog, Post). Here it is:&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; ()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; Nav&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;Key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Model Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Cmd Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span&gt; url key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- Parse our url and generate initial model&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;   let&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; parseUrl url&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; route&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Nothing&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Nothing&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; blogPosts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Nothing&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;   in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;   case &lt;&#x2F;span&gt;&lt;span&gt;model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- Load view directly&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;      Home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         (  {&lt;&#x2F;span&gt;&lt;span&gt; model &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;               |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;pageLayout model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;route&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Koncepto Sociala&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; Home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;view&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Koncepto Sociala&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span&gt; Cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- Send some HTTP request with a result returned as our Event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;      Blog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         (&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span&gt; Http&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;..&#x2F;posts&#x2F;index.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            -- result will be parsed from JSON to our `List PostData` type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; expect&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Http&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;expectJson&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; PostsIndexLoaded&lt;&#x2F;span&gt;&lt;span&gt; postListDecoder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- Other routes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;update&lt;&#x2F;code&gt; function: here we will process all the events emitted:&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Model Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Model Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Cmd Event&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt; msg model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;   case &lt;&#x2F;span&gt;&lt;span&gt;msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- event matching&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;code&gt;UrlChange&lt;&#x2F;code&gt; and &lt;code&gt;LinkClicked&lt;&#x2F;code&gt; are
usual for most of Elm apps where manipulation with links happens:&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;UrlChange&lt;&#x2F;span&gt;&lt;span&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- We call init for every URL change, as we need to parse it&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- for every route and remove unnecessary data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   init&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; ()&lt;&#x2F;span&gt;&lt;span&gt; url model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;LinkClicked&lt;&#x2F;span&gt;&lt;span&gt; req&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;   case &lt;&#x2F;span&gt;&lt;span&gt;req&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;      External&lt;&#x2F;span&gt;&lt;span&gt; href&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         (&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Nav&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;load href&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;      Internal&lt;&#x2F;span&gt;&lt;span&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         (&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Nav&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pushUrl model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;Url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;toString url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;) )&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;But let&#x27;s also look at a more interesting event:&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;-- Emitted, when a post loaded from HTTP request&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;PostLoaded&lt;&#x2F;span&gt;&lt;span&gt; result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;   case &lt;&#x2F;span&gt;&lt;span&gt;result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- If it is actually loaded — we parse its content&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- to our Post model using custom parser;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- for more info, look at a repo of this website (links are at the post footer)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;      Ok&lt;&#x2F;span&gt;&lt;span&gt; content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;         let &lt;&#x2F;span&gt;&lt;span&gt;post&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Parser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;run PostModel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parse content&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;         case &lt;&#x2F;span&gt;&lt;span&gt;post&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;            Ok&lt;&#x2F;span&gt;&lt;span&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               (  {&lt;&#x2F;span&gt;&lt;span&gt; model &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;                     |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;pageLayout model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;route&lt;&#x2F;span&gt;&lt;span&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;Post&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;view p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;                     ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;                  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;               -- What is this? We&amp;#39;ll find out soon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               ,&lt;&#x2F;span&gt;&lt;span&gt; nextTick&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; DomReady&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            -- Print errors, if parsing failed, for debug purposes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;            Err&lt;&#x2F;span&gt;&lt;span&gt; errors&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               (  {&lt;&#x2F;span&gt;&lt;span&gt; model &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;                     |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Post parsing error:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; ++&lt;&#x2F;span&gt;&lt;span&gt; parsingErrors errors&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;                     ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Post parsing error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;                  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               ,&lt;&#x2F;span&gt;&lt;span&gt; Cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;      -- Loading failed ;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;      Err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; _&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ( {&lt;&#x2F;span&gt;&lt;span&gt; model &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;               |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentPage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Post not found&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;               ,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; currentTitle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Post not found&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         ,&lt;&#x2F;span&gt;&lt;span&gt; Cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;         )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;highlight-js-or-sync-pitfalls&quot;&gt;Highlight.js or sync pitfalls&lt;&#x2F;h2&gt;
&lt;p&gt;What if we want to use some external JS library, which will process&#x2F;change our DOM like Highlight.js?
How shall we synchronize Elm, finishing generating our DOM, and our library, which must
process it afterwards? Official documentation suggests, that we need &lt;strong&gt;ports&lt;&#x2F;strong&gt; — tool for
interracting with some JavaScript code in Elm.&lt;&#x2F;p&gt;
&lt;p&gt;Include needed libraries and change Elm initialization like this (don&#x27;t forget to sync 404.html
and index.html):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Init Elm app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; app&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; Elm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;Main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;init&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; We will call hljs.highlightAll(); only when the message is sent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;ports&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;sendMessage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;subscribe&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;   hljs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;highlightAll&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then we rename our &lt;code&gt;module&lt;&#x2F;code&gt; to &lt;code&gt;port module&lt;&#x2F;code&gt; and add &lt;code&gt;port sendMessage : () -&amp;gt; Cmd msg&lt;&#x2F;code&gt; to the top of
our module, where events are processed. However, if you try to use &lt;code&gt;sendMessage&lt;&#x2F;code&gt; directly, as suggested
in official tutorials, you may find out, that Highlight.js works... but every other time. It happens because
Highlight.js is still not really synchronized well and may be called before the DOM is completely generated.&lt;&#x2F;p&gt;
&lt;p&gt;To avoid this behaviour, we will use our custom &lt;code&gt;DomReady&lt;&#x2F;code&gt; event, which we prepared before, along with our custom &lt;code&gt;nextTick&lt;&#x2F;code&gt; function to make a small delay before calling JavaScript (20 ms should be sufficient):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;nextTick&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; Cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; msg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;nextTick&lt;&#x2F;span&gt;&lt;span&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Task&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;perform&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;\_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;) (&lt;&#x2F;span&gt;&lt;span&gt;Process&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;sleep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, when we send &lt;code&gt;nextTick DomReady&lt;&#x2F;code&gt; command every time, where our JS library should be called, we will wait for
20 ms and then push &lt;code&gt;DomReady&lt;&#x2F;code&gt; event to the application, which will be processed in a following straightforward way:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;elm&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;DomReady&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;   -- means: send request event for JavaScript call&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;   (&lt;&#x2F;span&gt;&lt;span&gt; model&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; sendMessage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; ()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;what-s-next&quot;&gt;What&#x27;s next?&lt;&#x2F;h2&gt;
&lt;p&gt;In this post I&#x27;ve not covered all the topics, that would be useful for making your Elm blog or
another application using Elm, so here is some utile resources and libraries to learn:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;konceptosociala&#x2F;konceptosociala.github.io&#x2F;&quot;&gt;This website full code&lt;&#x2F;a&gt; — nothing to say
more: useful utilities for parsing, data types and functions to work with them;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;package.elm-lang.org&#x2F;packages&#x2F;rtfeldman&#x2F;elm-css&#x2F;latest&#x2F;&quot;&gt;elm-css&lt;&#x2F;a&gt; — using CSS styling
directly in Elm code;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;package.elm-lang.org&#x2F;packages&#x2F;elm&#x2F;parser&#x2F;latest&#x2F;&quot;&gt;elm-parser&lt;&#x2F;a&gt; — writing parsers easily;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;package.elm-lang.org&#x2F;packages&#x2F;mdgriffith&#x2F;elm-ui&#x2F;latest&#x2F;&quot;&gt;elm-ui&lt;&#x2F;a&gt; — UI design toolkit as
alternative for HTML&#x2F;CSS. Looks promising, but I don&#x27;t quite understand it yet;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;package.elm-lang.org&#x2F;packages&#x2F;elm&#x2F;json&#x2F;latest&#x2F;&quot;&gt;json&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;package.elm-lang.org&#x2F;packages&#x2F;elm&#x2F;http&#x2F;latest&#x2F;&quot;&gt;http&lt;&#x2F;a&gt; libraries — mandatory for any web app.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;If I missed something or made a mistake — don&#x27;t hesitate and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;konceptosociala&#x2F;konceptosociala.github.io&#x2F;issues&quot;&gt;file an issue&lt;&#x2F;a&gt; :3&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Loading 3D texture in Bevy</title>
        <published>2025-05-27T00:00:00+00:00</published>
        <updated>2025-05-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://konceptosociala.eu.org/tutorials/loading-3d-texture-in-bevy/"/>
        <id>https://konceptosociala.eu.org/tutorials/loading-3d-texture-in-bevy/</id>
        
        <content type="html" xml:base="https://konceptosociala.eu.org/tutorials/loading-3d-texture-in-bevy/">&lt;p&gt;To load an image into our app Bevy provides us with a custom &lt;code&gt;Image&lt;&#x2F;code&gt; type. However, &lt;code&gt;AssetServer&lt;&#x2F;code&gt;
in Bevy (as of version 0.15) only supports 2D image loading for now, so we need to perhaps
implement a custom 3D image asset loader. For our tutorial we will use png and jpeg raster image
types, but you can also try to implement importing of raw MagicaVoxel data, e.g. using &lt;code&gt;dot_vox&lt;&#x2F;code&gt; crate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;implementing-image3dloader&quot;&gt;Implementing Image3dLoader&lt;&#x2F;h2&gt;
&lt;p&gt;First, we&#x27;ll define our voxel texture format, Bevy plugin and loader struct itself:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; RGB for color, A - 1 for `active`, 0 for `inactive`.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; As optimization in ray tracing you can consider using 1 byte&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; texture format like R8Uint and use 0 value for `inactive` &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; and 1-255 values as color palette indices.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; const&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;font-weight: bold;&quot;&gt; IMAGE_3D_FORMAT&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Rgba8Uint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dPlugin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Use a plugin to register our asset loader&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Plugin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dPlugin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; app&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; App&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        app&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;init_asset_loader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And our loader settings will look like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Serialize&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Deserialize&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; struct&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; ImageFormatSetting&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It&#x27;s important to note, that Bevy &lt;code&gt;AssetServer&lt;&#x2F;code&gt; supports only 1 loader per file extension
(or a bundle of extensions), but we need to use png and jpeg formats, which are already
bound by default loader. The easiest approach is to add an extension prefix, e.g. &lt;code&gt;.3d&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;d also like to define image column and row count in a filename for quick import, like
(NxM). So our filename template will be: &lt;code&gt;&amp;lt;image_name&amp;gt;.(&amp;lt;N&amp;gt;x&amp;lt;M&amp;gt;).3d.png&lt;&#x2F;code&gt;. Now getting our loading
settings from a file path is straightforward:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    pub fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; from_path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; AsRef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; get &amp;quot;&amp;lt;image_name&amp;gt;.(&amp;lt;N&amp;gt;x&amp;lt;M&amp;gt;).3d&amp;quot; part from path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; stem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; format!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;:?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&amp;quot;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;as_ref&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;file_stem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;unwrap_or_default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;        Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;from_str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;stem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; And implement `from_str`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; FromStr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; from_str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; cols_rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            &#x2F;&#x2F; &amp;quot;(&amp;lt;cols&amp;gt;x&amp;lt;rows&amp;gt;)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;trim_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;trim_end_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;.3d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;split&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;next_back&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ok_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;FromStrError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            &#x2F;&#x2F; &amp;quot;&amp;lt;cols&amp;gt;x&amp;lt;rows&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;trim_start_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;trim_end_matches&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            &#x2F;&#x2F; (&amp;quot;&amp;lt;cols&amp;gt;&amp;quot;, &amp;quot;&amp;lt;rows&amp;gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;split_once&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ok_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;FromStrError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; cols_rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;FromStrError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;        let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; cols_rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;FromStrError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;        Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;            columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;            rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;            ..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;        })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The last thing to consider before implementing &lt;code&gt;Image3dLoader&lt;&#x2F;code&gt; is a custom
error type which will handle all possible problems while loading our 3D image.
We&#x27;ll use &lt;code&gt;thiserror&lt;&#x2F;code&gt; crate for simplicity:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span&gt;non_exhaustive&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;#[&lt;&#x2F;span&gt;&lt;span&gt;derive&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;pub&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt; enum&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Invalid columns number: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    InvalidColumnsNumber&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Invalid rows number: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    InvalidRowsNumber&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Guessed format is unknown and cannot be determined&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    UnknownFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Unsupported native format: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0:?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    InvalidNativeFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;bevy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ImageFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Invalid extension: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0:?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    InvalidExtension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;OsString&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Cannot load 3D image: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    ImageError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(#[&lt;&#x2F;span&gt;&lt;span&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ImageError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;I&#x2F;O error: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0:?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    IoError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(#[&lt;&#x2F;span&gt;&lt;span&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; io&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    #[&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;Cannot convert path to 3D image settings: invalid string format &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;; expected &amp;lt;name&amp;gt;.(&amp;lt;columns&amp;gt;x&amp;lt;rows&amp;gt;).3d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;)]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    FromStrError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;String&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, fill our &lt;code&gt;AssetLoader&lt;&#x2F;code&gt; trait implementation with required types and functions:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;impl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; AssetLoader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Asset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Option&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; extensions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;] {&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;        &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;3d.png&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;3d.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;3d.jpeg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;            &#x2F;&#x2F; Other image types if needed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;        ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    async fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; load&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;        &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; dyn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        load_context&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; LoadContext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    )&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Asset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; Self&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; implementation later&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At first place, retrieve all loader settings:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;use&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; ImageFormatSetting&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; If settings are not provided, retrieve them from our file path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderSettings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;from_path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;load_context&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;())&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Check whether our row and column count is correct&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;columns &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;InvalidColumnsNumber&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;rows &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;InvalidRowsNumber&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Read asset file to `Vec`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;[];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;read_to_end&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;await&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; ext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; load_context&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;extension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;ext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; ext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;to_owned&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ok_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;InvalidExtension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;None&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Get image format to load: by extension, manually or by `magic guessing`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;format &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    FromExtension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; ImageFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;from_extension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;ext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ok_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;InvalidExtension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;ext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    Format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;as_image_crate_format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;ok_or&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;InvalidNativeFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;    Guess&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;guess_format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;map_err&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image3dLoaderError&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;UnknownFormat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now we need to store our 3D data, retrieved from row-column aligned 2D image, to 1d bytes array,
because all data is transfered to GPU bit-by-bit. This may sound complicated, but we can calculate each
next pixel, pushed to 1d array, with a following simple formula:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;img&#x2F;blog&#x2F;voxel-ray-tracing&#x2F;formula.svg&quot; alt=&quot;formula&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;where &lt;code&gt;c&lt;&#x2F;code&gt; and &lt;code&gt;r&lt;&#x2F;code&gt; are current column and row accordingly, &lt;code&gt;x&lt;&#x2F;code&gt; and &lt;code&gt;y&lt;&#x2F;code&gt; are current tile coordinates and
&lt;code&gt;w&lt;&#x2F;code&gt; and &lt;code&gt;h&lt;&#x2F;code&gt; are single tile width and height. The algorithm will look like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Load image with `image` crate using previously determined format&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; img&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;load_from_memory_with_format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;to_rgba8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; bw&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; img&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;width&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; bh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; img&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;height&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Calculate single tile dimensions using previously determined&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; column and row size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; w&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; bw&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;columns&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; h&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; bh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; vec!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;[];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Calculate each next pixel position&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;rows &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;columns &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;h&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;            for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;w&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;                let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; pixel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; img&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;get_pixel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; w&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; h&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;                data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;extend&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;pixel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And finally we create an &lt;code&gt;Image&lt;&#x2F;code&gt; instance using a GPU texture descriptor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Define image dimensions&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Extent3d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    width&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; w&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    height&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; h&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    depth_or_array_layers&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;columns &lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; img&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    texture_descriptor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureDescriptor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt; {&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        label&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Some&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;image 3d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;),&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; Change it, if you need mip-map optimizations&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        mip_level_count&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        sample_count&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        dimension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureDimension&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;D3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;font-weight: bold;&quot;&gt; IMAGE_3D_FORMAT&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;        &#x2F;&#x2F; Add other usages if needed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        usage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureUsages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;font-weight: bold;&quot;&gt;TEXTURE_BINDING&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;            |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureUsages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;font-weight: bold;&quot;&gt;COPY_DST&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;            |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; TextureUsages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;font-weight: bold;&quot;&gt;STORAGE_BINDING&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;        view_formats&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D3869B;font-weight: bold;&quot;&gt;IMAGE_3D_FORMAT&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;    asset_usage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; RenderAssetUsages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;    ..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;};&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #928374;font-style: italic;&quot;&gt;&#x2F;&#x2F; Return our loaded 3D image&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;img&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let&#x27;s test it! Just add an asset server to our system and load our image as an asset:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #EBDBB2; background-color: #282828;&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FB4934;&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; system&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt;asset_server&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Res&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;AssetServer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FE8019;&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; handle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt; Handle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;Image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #83A598;&quot;&gt; asset_server&lt;&#x2F;span&gt;&lt;span style=&quot;color: #8EC07C;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FABD2F;&quot;&gt;load&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B8BB26;&quot;&gt;my_image.(5x2).3d.png&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;&amp;quot;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A89984;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;In this post, we explored how to implement a custom 3D texture loader for Bevy by leveraging the asset pipeline and extending it to support 3D data stored in standard 2D image formats. By organizing our 3D data as tiled slices and parsing loader settings from filenames, we can efficiently import and use 3D textures in our Bevy projects. This approach opens up new possibilities for voxel rendering, volumetric effects, and custom texture workflows, even before native 3D texture support lands in Bevy. Happy experimenting!&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
