From e8e506f870f332fc937bbe99b858a2cae663edbd Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Sun, 5 Apr 2020 16:22:16 -0700 Subject: [PATCH] ui: Refactor Timer into it's own module. --- ui/src/Layout.elm | 40 ++++++------------------------------- ui/src/Timer.elm | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 ui/src/Timer.elm diff --git a/ui/src/Layout.elm b/ui/src/Layout.elm index 43580c4..42d3ac3 100644 --- a/ui/src/Layout.elm +++ b/ui/src/Layout.elm @@ -41,6 +41,7 @@ import Modal import Process import Route exposing (Route) import Task +import Timer exposing (Timer) {-| Used to highlight current page in navbar. @@ -61,41 +62,12 @@ type alias Model msg = } -type Timer - = New - | Idle Int - | Timer Int - - -replaceTimer : Timer -> Timer -replaceTimer previous = - case previous of - New -> - Timer 0 - - Idle index -> - Timer (index + 1) - - Timer index -> - Timer (index + 1) - - -cancelTimer : Timer -> Timer -cancelTimer previous = - case previous of - Timer index -> - Idle (index + 1) - - _ -> - previous - - init : (Msg -> msg) -> Model msg init mapMsg = { mapMsg = mapMsg , mainMenuVisible = False , recentMenuVisible = False - , recentMenuTimer = New + , recentMenuTimer = Timer.empty , mailboxName = "" } @@ -107,7 +79,7 @@ reset model = { model | mainMenuVisible = False , recentMenuVisible = False - , recentMenuTimer = cancelTimer model.recentMenuTimer + , recentMenuTimer = Timer.cancel model.recentMenuTimer , mailboxName = "" } @@ -168,7 +140,7 @@ update msg model session = RecentMenuMouseOver -> ( { model | recentMenuVisible = True - , recentMenuTimer = cancelTimer model.recentMenuTimer + , recentMenuTimer = Timer.cancel model.recentMenuTimer } , session , Cmd.none @@ -177,7 +149,7 @@ update msg model session = RecentMenuMouseOut -> let newTimer = - replaceTimer model.recentMenuTimer + Timer.replace model.recentMenuTimer in ( { model | recentMenuTimer = newTimer @@ -190,7 +162,7 @@ update msg model session = if timer == model.recentMenuTimer then ( { model | recentMenuVisible = False - , recentMenuTimer = cancelTimer timer + , recentMenuTimer = Timer.cancel timer } , session , Cmd.none diff --git a/ui/src/Timer.elm b/ui/src/Timer.elm new file mode 100644 index 0000000..4fa640a --- /dev/null +++ b/ui/src/Timer.elm @@ -0,0 +1,51 @@ +module Timer exposing (Timer, cancel, empty, replace) + +{-| Implements an identity to track an asynchronous timer. +-} + + +type Timer + = Empty + | Idle Int + | Timer Int + + +empty : Timer +empty = + Empty + + +{-| Replaces the provided timer with a newly created one. +-} +replace : Timer -> Timer +replace previous = + case previous of + Empty -> + Timer 0 + + Idle index -> + Timer (next index) + + Timer index -> + Timer (next index) + + +{-| Cancels the provided timer without creating a replacement. +-} +cancel : Timer -> Timer +cancel previous = + case previous of + Timer index -> + Idle index + + _ -> + previous + + +next : Int -> Int +next index = + if index > 2 ^ 30 then + 0 + + else + index + 1