Now we’ll look at an example available in Elm
‘s online documentation called Buttons
. This example is also the example in the image simulating the basic architecture of Elm
in the first part of the previous article. Our example execution sequence will be make it work
and then make it nice
. And the extra CSS code to make the elements more visible we’ll leave it for last, when the components can already work.
Abstraction
We will have a div
displaying an integer value, accompanied by 2 buttons +
and -
to perform the function of increasing / decreasing the displayed value.
Initially, we need to determine the output
of the program. And in the module Browser
, right at the top Elm
recommends using Browser.sandbox
to learn the basics of interaction. This program only requires the correct minimum set of input parameters, a Record { init, view, update }
that we talked about in the introduction to the basic Elm Architecture
.
So if we name the program Buttons
and encapsulate it in a separate module
, the Main
program will be fixed like this:
1 2 3 4 5 6 7 | <span class="token keyword">module</span> <span class="token constant">Main</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token hvariable">main</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Browser <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Buttons <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token hvariable">main</span> <span class="token operator">:</span> <span class="token constant">Program</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token constant">Model</span> <span class="token constant">Message</span> <span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token hvariable">Browser.sandbox</span> <span class="token punctuation">(</span> <span class="token constant">Buttons</span> <span class="token hvariable">init</span> <span class="token hvariable">view</span> <span class="token hvariable">update</span> <span class="token punctuation">)</span> |
Here the Model
record type identifiers, the Message
event message type, the Buttons
record initializer, and the init
, view
, and update
programs will all be defined in the module Buttons
.
1 2 3 4 | <span class="token keyword">module</span> <span class="token constant">Buttons</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token constant">Buttons</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> <span class="token keyword">alias</span> <span class="token constant">Buttons</span> <span class="token operator">=</span> <span class="token constant">Nothing</span> |
To create usage records for Browser.sandbox
, we need to go through the configuration of this subroutine a bit.
1 2 3 4 5 6 7 | <span class="token hvariable">sandbox</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token hvariable">model</span> <span class="token punctuation">,</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token hvariable">model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token hvariable">msg</span> <span class="token punctuation">,</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token hvariable">msg</span> <span class="token operator">-></span> <span class="token hvariable">model</span> <span class="token operator">-></span> <span class="token hvariable">model</span> <span class="token punctuation">}</span> <span class="token operator">-></span> <span class="token constant">Program</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token hvariable">model</span> <span class="token hvariable">msg</span> |
So we will need a Record
containing the programs init
, view
, update
as above. In the recursion
way of thinking, we will pause the Buttons
initializer as above to define the sub-program
first.
And to check the operation of the subroutines in the module
, we will not be able to use elm reactor
but will need to interact with elm repl
.
1 2 3 | cd Documents && cd learn-elm elm repl |
Init
The first is init
– the program that initializes the Model
data record to use for the view
to display the user interface. So we will need to define the Model
record type first to use for init
.
Since our program has only one up-to-date element, the integer value displayed between the +
and -
buttons, we will have a simple Model
. And the init
program to initialize the first data record is also unremarkable. No input parameters are required and the exact Model
record is returned.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">module</span> <span class="token constant">Buttons</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token constant">Buttons</span> <span class="token punctuation">,</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token hvariable">init</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> <span class="token keyword">alias</span> <span class="token constant">Buttons</span> <span class="token operator">=</span> <span class="token constant">Nothing</span> <span class="token comment">-- Initializer - - - - - - - - -</span> <span class="token keyword">type</span> <span class="token keyword">alias</span> <span class="token constant">Model</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token hvariable">value</span> <span class="token operator">:</span> <span class="token constant">Int</span> <span class="token punctuation">}</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token hvariable">init</span> <span class="token operator">=</span> <span class="token constant">Model</span> <span class="token number">0</span> |
1 2 3 | <span class="token hvariable">init</span> <span class="token comment">-- { value = 0 } : Model </span> |
View
Next is view
– a program to structure template HTML
to build user interfaces. Here we also define the Message
event message types to describe the meaning of user action. And with the expected interaction of two buttons to increase / decrease the value, we will have two types of messages, respectively, Increment
and Decrement
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">module</span> <span class="token constant">Buttons</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html.Events <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html.Attributes <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token comment">-- type alias Buttons = Nothing</span> <span class="token comment">-- Initializer ...</span> <span class="token comment">-- Templater - - - - - - - - -</span> <span class="token keyword">type</span> <span class="token constant">Message</span> <span class="token operator">=</span> <span class="token constant">Increment</span> <span class="token operator">|</span> <span class="token constant">Decrement</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token constant">Message</span> <span class="token hvariable">view</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token keyword">let</span> <span class="token hvariable">value</span> <span class="token operator">=</span> <span class="token hvariable">String.fromInt</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">value</span> <span class="token keyword">in</span> <span class="token hvariable">div</span> <span class="token punctuation">[</span> <span class="token hvariable">attribute</span> <span class="token string">"id"</span> <span class="token string">"app"</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">button</span> <span class="token punctuation">[</span> <span class="token hvariable">onClick</span> <span class="token constant">Decrement</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">text</span> <span class="token string">"-"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token hvariable">div</span> <span class="token punctuation">[</span> <span class="token hvariable">attribute</span> <span class="token string">"id"</span> <span class="token string">"out"</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">text</span> <span class="token hvariable">value</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token hvariable">button</span> <span class="token punctuation">[</span> <span class="token hvariable">onClick</span> <span class="token constant">Increment</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token hvariable">text</span> <span class="token string">"+"</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> |
Here the id="app"
and id="out"
part I use as a selector for the CSS code after completing the operation logic.
1 2 3 | <span class="token hvariable">view</span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token number">1001</span> <span class="token punctuation">)</span> <span class="token comment">-- <internals> : Html.Html Message</span> |
Perhaps the view
could have worked just fine. However, if you want to check the display results, you can write a main
program right in the module Buttons
and open the Buttons.elm
file in the elm reactor
.
1 2 3 4 5 6 7 8 | <span class="token comment">-- Initializer ...</span> <span class="token comment">-- Templater - - - - - - - - -</span> <span class="token comment">-- view : ...</span> <span class="token hvariable">main</span> <span class="token operator">:</span> <span class="token constant">Html</span> <span class="token constant">Message</span> <span class="token hvariable">main</span> <span class="token operator">=</span> <span class="token hvariable">view</span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token number">1001</span> <span class="token punctuation">)</span> |
We will still need to use elm repl
so let’s open another command line window for elm reactor
.
1 2 3 | cd Documents && cd learn-elm elm reactor |
http://localhost:8000/src/Buttons.elm
Update
Finally update
– this program will receive an event message Message
and a Model
record describing the data being displayed at the moment. Then update
will parse the event message and generate a new Model
record with the value increased or decreased by 1 unit.
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">-- Initializer ...</span> <span class="token comment">-- Templater ...</span> <span class="token comment">-- Updater - - - - - - - - -</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token constant">Message</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token hvariable">update</span> <span class="token hvariable">message</span> <span class="token hvariable">model</span> <span class="token operator">=</span> <span class="token keyword">case</span> <span class="token hvariable">message</span> <span class="token keyword">of</span> <span class="token constant">Increment</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token punctuation">(</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">value</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token constant">Decrement</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token punctuation">(</span> <span class="token hvariable">model</span> <span class="token punctuation">.</span> <span class="token hvariable">value</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">)</span> |
1 2 3 4 5 6 | <span class="token hvariable">update</span> <span class="token constant">Increment</span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token comment">-- { value = 1 } : Model</span> <span class="token hvariable">update</span> <span class="token constant">Decrement</span> <span class="token punctuation">(</span> <span class="token constant">Model</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token comment">-- { value = -1 } : Model</span> |
Buttons
So all sub-program
are working fine. Now we just need to finish the Buttons
record definition and run the program in elm reactor
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">module</span> <span class="token constant">Buttons</span> <span class="token keyword">exposing</span> <span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html.Events <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token import-statement"><span class="token keyword">import</span> Html.Attributes <span class="token keyword">exposing</span> </span><span class="token punctuation">(</span> <span class="token operator">..</span> <span class="token punctuation">)</span> <span class="token keyword">type</span> <span class="token keyword">alias</span> <span class="token constant">Buttons</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token hvariable">init</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token punctuation">,</span> <span class="token hvariable">view</span> <span class="token operator">:</span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Html</span> <span class="token constant">Message</span> <span class="token punctuation">,</span> <span class="token hvariable">update</span> <span class="token operator">:</span> <span class="token constant">Message</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token operator">-></span> <span class="token constant">Model</span> <span class="token punctuation">}</span> <span class="token comment">-- Initializer ...</span> <span class="token comment">-- Templater ...</span> <span class="token comment">-- Updater ...</span> |
http://localhost:8000/src/Main.elm
After trying to click on the +
and -
buttons, if you see that everything is working fine, you can press Ctrl+C
to stop elm reactor
and run the elm make
command.
1 2 3 4 5 | elm make src/Main.elm Success! Main ───> index.html |
You can now append a <link href="style.css">
to the newly generated index.html
file and add a bit of CSS code before opening this file directly in a web browser to test it out.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token selector">*</span> <span class="token punctuation">{</span> <span class="token property">box-sizing</span> <span class="token punctuation">:</span> border-box <span class="token punctuation">;</span> <span class="token property">margin</span> <span class="token punctuation">:</span> 0 <span class="token punctuation">;</span> <span class="token property">padding</span> <span class="token punctuation">:</span> 0 <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#app</span> <span class="token punctuation">{</span> <span class="token property">border</span> <span class="token punctuation">:</span> 1px solid lightgray <span class="token punctuation">;</span> <span class="token property">border-radius</span> <span class="token punctuation">:</span> 5px <span class="token punctuation">;</span> <span class="token property">display</span> <span class="token punctuation">:</span> inline-block <span class="token punctuation">;</span> <span class="token property">margin</span> <span class="token punctuation">:</span> 27px 45px <span class="token punctuation">;</span> <span class="token property">padding</span> <span class="token punctuation">:</span> 9px <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#app button</span> <span class="token punctuation">{</span> <span class="token property">font-size</span> <span class="token punctuation">:</span> 21px <span class="token punctuation">;</span> <span class="token property">border-radius</span> <span class="token punctuation">:</span> 50% <span class="token punctuation">;</span> <span class="token property">border</span> <span class="token punctuation">:</span> none <span class="token punctuation">;</span> <span class="token property">padding</span> <span class="token punctuation">:</span> 12px 21px <span class="token punctuation">;</span> <span class="token property">margin</span> <span class="token punctuation">:</span> 0 2px <span class="token punctuation">;</span> <span class="token property">cursor</span> <span class="token punctuation">:</span> pointer <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">#out</span> <span class="token punctuation">{</span> <span class="token property">font-size</span> <span class="token punctuation">:</span> 24px <span class="token punctuation">;</span> <span class="token property">text-align</span> <span class="token punctuation">:</span> center <span class="token punctuation">;</span> <span class="token property">display</span> <span class="token punctuation">:</span> inline-block <span class="token punctuation">;</span> <span class="token property">padding</span> <span class="token punctuation">:</span> 9px 24px <span class="token punctuation">;</span> <span class="token property">min-width</span> <span class="token punctuation">:</span> 90px <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Oh… and that’s the sequence to create an element
with Elm Architecture
. On the other hand, Browser.sandbox
will limit this element
to not be able to interact with the external environment. So it’s safe to try creating a few element
like drop-down lists or dropdown
carousel
to insert into the website you’ve built before.
1 2 | elm make src/Main.elm --output buttons.js |
To embed the newly created element
into a web page that you have built before, you need to embed the button.js
and style.css
files in the template
of the existing website. And add a pair of tags:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> link</span> <span class="token attr-name">rel</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> stylesheet <span class="token punctuation">"</span></span> <span class="token attr-name">href</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> style.css <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> head</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> body</span> <span class="token punctuation">></span></span> <span class="token comment"><!-- somewhere in --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> elm-buttons <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token comment"><!-- the document --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">const</span> app <span class="token operator">=</span> Elm <span class="token punctuation">.</span> Buttons <span class="token punctuation">.</span> <span class="token function">init</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> node <span class="token operator">:</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">"elm-buttons"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> elm.js <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> |
In case you want to create element
that can interact with external components or send requests to query data to the server
, then we have Browser.element
. This program will require a few more elements in the input parameter to support data query operations from the server
to be executed async
. And so our next concern will be how to send HTTP request
and update the results from async
operations.
Elm Architecture in JS/jQuery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <span class="token comment">/* -- init - - - - - - - - - */</span> <span class="token comment">// -- Model = { value : any }</span> <span class="token keyword">const</span> <span class="token function-variable function">Model</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">value</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> value <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// -- init : number -> Model</span> <span class="token keyword">const</span> <span class="token function-variable function">init</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">value</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">Model</span> <span class="token punctuation">(</span> value <span class="token punctuation">)</span> <span class="token comment">/* -- view - - - - - - - - - */</span> <span class="token comment">// -- view : Model -> jElement</span> <span class="token keyword">const</span> <span class="token function-variable function">view</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">model</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> <div id="app" data-value="</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> model <span class="token punctuation">.</span> value <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">"> <button> - </button> <div id="out"> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> model <span class="token punctuation">.</span> value <span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> </div> <button> + </button> </div> </span><span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token comment">/* -- update - - - - - - - - - */</span> <span class="token comment">// -- Message = Decrement | Increment</span> <span class="token keyword">const</span> Decrement <span class="token operator">=</span> <span class="token string">"decrease"</span> <span class="token keyword">const</span> Increment <span class="token operator">=</span> <span class="token string">"increase"</span> <span class="token comment">// -- update : Message -> Model -> Model</span> <span class="token keyword">const</span> <span class="token function-variable function">update</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">message</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token parameter">model</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> message <span class="token operator">==</span> Decrement <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">Model</span> <span class="token punctuation">(</span> model <span class="token punctuation">.</span> value <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> message <span class="token operator">==</span> Increment <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">Model</span> <span class="token punctuation">(</span> model <span class="token punctuation">.</span> value <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token string">"any-other-case"</span> <span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span> <span class="token punctuation">(</span> <span class="token string">"Invalid Message"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">/* -- Buttons - - - - - - - - - */</span> <span class="token comment">// -- Buttons : init -> view -> update -> jElement</span> <span class="token keyword">const</span> <span class="token function-variable function">Buttons</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token parameter">init</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token parameter">view</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token parameter">update</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">var</span> $app <span class="token operator">=</span> <span class="token function">view</span> <span class="token punctuation">(</span> <span class="token function">init</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> $app <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> Increment <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> Decrement <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">var</span> value <span class="token operator">=</span> Number <span class="token punctuation">.</span> <span class="token function">parseInt</span> <span class="token punctuation">(</span> $app <span class="token punctuation">.</span> <span class="token function">attr</span> <span class="token punctuation">(</span> <span class="token string">"data-value"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> model <span class="token operator">=</span> <span class="token function">update</span> <span class="token punctuation">(</span> event <span class="token punctuation">.</span> type <span class="token punctuation">)</span> <span class="token punctuation">(</span> <span class="token function">Model</span> <span class="token punctuation">(</span> value <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> $app <span class="token punctuation">.</span> <span class="token function">attr</span> <span class="token punctuation">(</span> <span class="token string">"data-value"</span> <span class="token punctuation">,</span> model <span class="token punctuation">.</span> value <span class="token punctuation">)</span> <span class="token punctuation">;</span> $app <span class="token punctuation">.</span> <span class="token function">children</span> <span class="token punctuation">(</span> <span class="token string">"div"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">text</span> <span class="token punctuation">(</span> model <span class="token punctuation">.</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> $app <span class="token punctuation">.</span> <span class="token function">children</span> <span class="token punctuation">(</span> <span class="token string">"button"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">first</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">"click"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token operator">=></span> $app <span class="token punctuation">.</span> <span class="token function">trigger</span> <span class="token punctuation">(</span> Decrement <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> $app <span class="token punctuation">.</span> <span class="token function">children</span> <span class="token punctuation">(</span> <span class="token string">"button"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">last</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">"click"</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">event</span> <span class="token punctuation">)</span> <span class="token operator">=></span> $app <span class="token punctuation">.</span> <span class="token function">trigger</span> <span class="token punctuation">(</span> Increment <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> $app <span class="token punctuation">}</span> <span class="token comment">// -- render the app</span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token string">"#js-buttons"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">append</span> <span class="token punctuation">(</span> <span class="token function">Buttons</span> <span class="token punctuation">(</span> init <span class="token punctuation">)</span> <span class="token punctuation">(</span> view <span class="token punctuation">)</span> <span class="token punctuation">(</span> update <span class="token punctuation">)</span> <span class="token punctuation">)</span> |
[Declarative Programming + Elm] Lesson 12 – Commands & Subscriptions