-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimer.elm
91 lines (72 loc) · 2.12 KB
/
timer.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
module Timer exposing (Model, Msg, init, update, subscriptions, view, getTime)
import Html exposing (..)
import Html.Attributes exposing (..)
import Time exposing (Time, second)
import Html.Events exposing (onClick)
import Html.App as Html
import Task exposing (perform)
import Date exposing (Date)
import Date.Extra.Config.Config_en_us exposing (config)
import Date.Extra.Format as Format exposing (format, formatUtc, isoMsecOffsetFormat)
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- model
type alias Model =
{ startTime : Time
, elapsedTime : Time
, isRunning : Bool
}
init : (Model, Cmd Msg)
init =
({ startTime = -3600000, elapsedTime = -3600000, isRunning = False }, Cmd.none)
-- update
type Msg
= Tick Time
| ToggleTimer
| ReceiveTime Time
| Reset
getTime : Model -> Float
getTime model =
model.elapsedTime
onError error =
error
onSuccess time =
ReceiveTime time
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Tick newTime ->
if model.isRunning then
({ model | elapsedTime = (newTime - model.startTime) }, Cmd.none)
else
(model, Cmd.none)
ToggleTimer ->
if model.isRunning then
({ model | isRunning = False }, Cmd.none)
else
(model, Task.perform onError onSuccess Time.now) -- Time.now is an unpredictable ("impure") function and is wrapped in a Task, like a Promise in JS
ReceiveTime time ->
({ model | startTime = time - model.elapsedTime, isRunning = True }, Cmd.none)
Reset ->
({ model | startTime = -3600000, elapsedTime = -3600000, isRunning = False }, Cmd.none)
-- subscriptions
subscriptions : Model -> Sub Msg
subscriptions model =
Time.every second Tick
-- view
view : Model -> Html Msg
view model =
let
currentDate = Date.fromTime model.elapsedTime
in
div []
[ div [] [ text ( format config "%H:%M:%S" currentDate ) ]
, button [ onClick ToggleTimer ] [ text "start" ]
, button [ onClick ToggleTimer ] [ text "pause/resume" ]
, button [ onClick Reset ] [ text "reset" ]
]