Slide 1

Slide 1 text

State as a Cookie Jar Joy Clark

Slide 2

Slide 2 text

Joy Clark Consultant @ innoQ joy.clark@innoq.com @iamjoyclark

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

state noun the particular condition that someone or something is in at a specific time. @iamjoyclark

Slide 5

Slide 5 text

mutable adjective liable to change @iamjoyclark

Slide 6

Slide 6 text

mutable state adjective + noun ?? @iamjoyclark

Slide 7

Slide 7 text

An entity changes over time… @iamjoyclark

Slide 8

Slide 8 text

Character #1 @iamjoyclark

Slide 9

Slide 9 text

Character #2 @iamjoyclark

Slide 10

Slide 10 text

Character #3 @iamjoyclark

Slide 11

Slide 11 text

@iamjoyclark Character #4

Slide 12

Slide 12 text

The value changes over time! @iamjoyclark

Slide 13

Slide 13 text

Clojure (defn take [{cookies ::cookies} to-take] (if (< to-take cookies) {::cookies (- cookies to-take)} {::cookies 0})) (defn cookie-monster [cookie-jar to-eat] (take cookie-jar to-eat)) (defn kitten [cookie-jar] (take cookie-jar 1)) (defn grandma [{cookies ::cookies} nr-baked] (if (pos? nr-baked) {::cookies (+ cookies nr-baked)} {::cookies cookies})) Joy Clark https://github.com/joyclark/cookie-jar

Slide 14

Slide 14 text

Elixir defmodule CookieJar do defstruct cookies: 0 def run(%{cookies: cookies}, [:cat | actions]) 
 when cookies > 0 do run(%CookieJar{cookies: cookies - 1}, actions) end def run(_, [:monster | actions]) do run(%CookieJar{cookies: 0}, actions) end def run(%{cookies: cookies}, [:grandma | actions]) do run(%CookieJar{cookies: cookies + 1}, actions) end def run(jar, _), do: jar end Mario Mainz https://github.com/mmainz/cookie_jar

Slide 15

Slide 15 text

Clojure with Mutable State (def cookie-jar (atom {::cookies 5})) (defn ghost [cookie-jar] (take cookie-jar 2)) (swap! cookie-jar grandma 5) (swap! cookie-jar kitten) (swap! cookie-jar ghost) @cookie-jar // => 7: retrieves current value of cookie-jar Joy Clark https://github.com/joyclark/cookie-jar @iamjoyclark

Slide 16

Slide 16 text

swap! explained @iamjoyclark

Slide 17

Slide 17 text

In an otherworldly dimension… In the kitchen… (def cookie-jar (atom {::cookies 5})) (swap! cookie-jar grandma 5) @cookie-jar => {::cookies 8} (swap! cookie-jar ghost) swap! retrieve {::cookies 5} (grandma {::cookies 5} 5) save! {::cookies 10} swap! retrieve {::cookies 5} (ghost {::cookies 5}) atom changed, retry! retrieve {::cookies 10} (ghost {::cookies 10}) save! {::cookies 8} @iamjoyclark

Slide 18

Slide 18 text

That’s All For Now! https://github.com/joyclark/cookie-jar @iamjoyclark