aboutsummaryrefslogtreecommitdiff
path: root/src/Update/Update.elm
blob: a556e36c925ba5abc09018b188e5d8c576e8b5fc (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
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
        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