tricorder-0.7.0.0: src/Tricorder/CLI/UI/State.hs
module Tricorder.CLI.UI.State
( Viewports (..)
, State (..)
, Processed (..)
, init
, currentRoute
, viewToViewport
, cycleTestFilter
, navigate
)
where
import Atelier.Effects.Clock (Clock, TimeZone)
import Tricorder.API.TestFilter (TestFilter)
import Prelude hiding (init)
import Atelier.Effects.Clock qualified as Clock
import Tricorder.API.TestFilter qualified as TestFilter
import Tricorder.Build (BuildState)
import Tricorder.CLI.UI.Route (Route)
import Tricorder.CLI.UI.Route qualified as Route
data Viewports
= MainViewport
| DiagnosticViewport
| TestViewport
| EvalResultsViewport
deriving stock (Eq, Ord, Show)
data State = State
{ buildState :: Processed Text BuildState
, timeZone :: TimeZone
, route :: Route
, testFilter :: TestFilter
, showHelp :: Bool
}
cycleTestFilter :: TestFilter -> TestFilter
cycleTestFilter x = if x == maxBound then minBound else succ x
data Processed e a
= Waiting
| Failure e
| Success a
currentRoute :: State -> Route
currentRoute = (.route)
viewToViewport :: Route -> Maybe Viewports
viewToViewport = \case
Route.Tests -> Just TestViewport
Route.Main -> Just DiagnosticViewport
_ -> Nothing
navigate :: Route -> State -> State
navigate route s = s {route}
init :: (Clock :> es) => Eff es State
init = do
tz <- Clock.currentTimeZone
pure
State
{ buildState = Waiting
, timeZone = tz
, route = Route.Main
, testFilter = TestFilter.All
, showHelp = False
}