-
Notifications
You must be signed in to change notification settings - Fork 1
/
RandomCoin.elm
116 lines (73 loc) · 1.64 KB
/
RandomCoin.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
module RandomCoin exposing (..)
import Html exposing (..)
import Html.Events exposing (onClick)
import Random
main : Program Never Model Msg
main =
Html.program { init = init, update = update, view = view, subscriptions = subscriptions }
-- MODEL
type alias Model =
{ coin : Coin
}
type Coin
= Head
| Tail
init : ( Model, Cmd Msg )
init =
{ coin = Head } ! []
-- UPDATE
type Msg
= NoOp
| FlibCoin
| SetCoin Coin
| RandomizeCoin
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
FlibCoin ->
{ model | coin = switch model.coin } ! []
SetCoin coin ->
{ model | coin = coin } ! []
RandomizeCoin ->
model ! [ Random.generate SetCoin coinGenerator ]
NoOp ->
model ! []
-- HELPERS
switch : Coin -> Coin
switch coin =
case coin of
Head ->
Tail
Tail ->
Head
coinGenerator : Random.Generator Coin
coinGenerator =
Random.map
(\b ->
if b then
Head
else
Tail
)
Random.bool
--- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- VIEW
view : Model -> Html Msg
view model =
div []
[ h1 []
[ text "Random Coin" ]
, viewCoin model.coin
, button [ onClick FlibCoin ] [ text "flib coin" ]
, button [ onClick RandomizeCoin ] [ text "randomize" ]
]
viewCoin : Coin -> Html Msg
viewCoin coin =
case coin of
Head ->
text "Head"
Tail ->
text "Tail"