aboutsummaryrefslogtreecommitdiff
path: root/src/Update/Update.elm
blob: f96a12806d1925108a0b5d3b8aaf49a7ffeb3ab2 (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
module Update.Update
  ( Action(..)
  , updates
  , update
  ) where

import Signal
import Dict
import Dict (Dict)
import Time (Time)
import Maybe
import Keyboard (KeyCode)
import Char
import Debug
import List

import Model.Model (..)
import Model.Timer (..)
import Model.TimerEdition (..)
import Model.Id (..)
import Model.IdGenerator (..)

import Update.UpdateTimer (..)
import Update.UpdateTimerEdition (..)

import Utils.Maybe (..)

type Action =
  NoOp
  | Initialize
  | AddNewTimer
  | DeltaTime Time
  | UpdateTimer Id TimerAction
  | RemoveTimer Id
  | EditTimer Id
  | ValidTimerEdition
  | ReadOnly
  | 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
          timerName = "Timer " ++ (toString id)
      in  { model
          | timers <- Dict.insert id (initialTimer model.currentTime timerName) model.timers
          , timerIdGenerator <- newTimerIdGenerator
          }
    DeltaTime delta ->
      { model
      | currentTime <- model.currentTime + delta
      , timers <- substractTimersTime delta model.timers
      }
    UpdateTimer id action ->
      let maybeTimerEdition = filterMaybe (\timerEdition -> timerEdition.id == id) model.timerEdition
      in  case maybeTimerEdition of
            Just timerEdition ->
              { model
              | timers <-
                  updateTimerTime timerEdition model.timers
                    |> Dict.update id (Maybe.map (updateTimer action))
              , timerEdition <- Nothing
              }
            Nothing ->
              { model | timers <- Dict.update id (Maybe.map (updateTimer action)) model.timers }
    RemoveTimer id ->
      if numberOfTimers model > 1
        then
          { model | timers <- Dict.remove id model.timers }
        else
          model
    EditTimer id ->
      { model
      | timerEdition <- Just (newTimerEdition id)
      , timers <- Dict.update id (Maybe.map (updateTimer Pause)) model.timers
      }
    ValidTimerEdition ->
      case model.timerEdition of
        Just timerEdition ->
          { model
          | timers <- updateTimerTime timerEdition model.timers
          , timerEdition <- Nothing
          }
        Nothing ->
          { model | timerEdition <- Nothing }
    ReadOnly ->
      { model | timerEdition <- Nothing }
    KeyPressed keyCode ->
      if isRemoveKeyCode keyCode
        then
          { model | timerEdition <- Maybe.map (updateTimerEdition DeleteLast) model.timerEdition }
        else
          { model | timerEdition <- Maybe.map (updateTimerEdition (AddNumber keyCode)) model.timerEdition }

updateTimerTime : TimerEdition -> Dict Id Timer -> Dict Id Timer
updateTimerTime timerEdition =
  if List.isEmpty timerEdition.numbers
    then
      identity
    else
      Dict.update timerEdition.id (Maybe.map (updateTimer (SetTime (toTime timerEdition.numbers))))

isRemoveKeyCode : KeyCode -> Bool
isRemoveKeyCode = (==) 8