blob: 2f4d7a4ea4385a63e8445688db109678360f606a (
plain)
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
module Update.Update
( Action(..)
, updates
, logUpdate
, update
) where
import Signal
import Dict
import Dict (Dict)
import Time (Time)
import Maybe
import Keyboard (KeyCode)
import Char
import List
import Debug
import Model.Model (..)
import Model.Timer (..)
import Model.Edition.Edition (..)
import Model.Edition.NameEdition (..)
import Model.Edition.TimeEdition (..)
import Model.Id (..)
import Model.IdGenerator (..)
import Update.UpdateTimer (..)
import Update.UpdateEdition (..)
import Utils.Maybe (..)
type Action =
NoOp
| Initialize
| AddNewTimer
| DeltaTime Time
| UpdateTimer Id TimerAction
| RemoveTimer Id
| Edit Id Kind
| ClickAway
| KeyPressed KeyCode
updates : Signal.Channel Action
updates = Signal.channel NoOp
logUpdate : Action -> Model -> Model
logUpdate action model =
case action of
DeltaTime _ -> update action model
_ -> update (Debug.log "action" action) model
update : Action -> Model -> Model
update action model =
case action of
NoOp -> model
Initialize ->
initialModel model.currentTime
AddNewTimer ->
let (id, newTimerIdGenerator) = getId model.timerIdGenerator
in { model
| timers <- Dict.insert id (initialTimer model.currentTime) model.timers
, timerIdGenerator <- newTimerIdGenerator
}
DeltaTime delta ->
{ model
| currentTime <- model.currentTime + delta
, timers <- Dict.map (\id timer -> updateTimer (SubstractTime delta) timer) model.timers
}
UpdateTimer id timerAction ->
let maybeEdition = filterMaybe (\edition -> edition.id == id) model.edition
newModel =
case maybeEdition of
Just edition ->
if edition.kind == Time then validEdition model else model
Nothing ->
model
in { newModel | timers <- Dict.update id (Maybe.map (updateTimer timerAction)) newModel.timers }
RemoveTimer id ->
if numberOfTimers model > 1
then
{ model | timers <- Dict.remove id model.timers }
else
model
Edit id kind ->
{ model
| edition <- Just (newEdition id kind)
, timers <-
if kind == Time
then Dict.update id (Maybe.map (updateTimer Pause)) model.timers
else model.timers
}
ClickAway ->
{ model | edition <- Nothing }
KeyPressed keyCode ->
if isEnterKeyCode keyCode
then
validEdition model
else
let editionAction =
if isRemoveKeyCode keyCode
then DeleteLast
else AddChar keyCode
in { model | edition <- Maybe.map (updateEdition editionAction) model.edition }
validEdition : Model -> Model
validEdition model =
case model.edition of
Just edition ->
if isEmpty edition
then
{ model
| edition <- Nothing
}
else
let timerAction =
case edition.kind of
Name ->
Rename (renderNameEdition edition.chars)
Time ->
SetTime (toTime edition.chars)
in { model
| timers <- Dict.update edition.id (Maybe.map (updateTimer timerAction)) model.timers
, edition <- Nothing
}
Nothing ->
model
isEnterKeyCode : KeyCode -> Bool
isEnterKeyCode = (==) 13
isRemoveKeyCode : KeyCode -> Bool
isRemoveKeyCode = (==) 8
|