packages feed

keter-2.1.10: src/Keter/SharedData/AppManager.hs

{-# LANGUAGE OverloadedStrings #-}

module Keter.SharedData.AppManager
    ( Action(..)
    , AppState(..)
    , showAppState
    ) where

import Control.Concurrent.STM (STM, TVar, readTVar)
import Data.Foldable (fold)
import Data.Text (Text, pack, unpack)
import Keter.Config (AppInput)
import Keter.SharedData.App (App, showApp)
import System.Posix.Types (EpochTime)
import Text.Printf (printf)

data Action = Reload AppInput | Terminate
 deriving Show

data AppState = ASRunning App
              | ASStarting
                    !(Maybe App)
                    !(TVar (Maybe EpochTime))
                    !(TVar (Maybe Action)) -- ^ the next one to try
              | ASTerminated

showAppState :: AppState -> STM Text
showAppState (ASRunning x) = (\x' -> "running(" <> x' <> ")") <$> showApp x
showAppState (ASStarting mapp tmtime tmaction) = do
  mtime   <- readTVar tmtime
  maction <- readTVar tmaction
  mtext <- traverse showApp mapp
  pure $ pack $ printf "starting app %s, time %s, action %s \n" (unpack $ fold mtext) (show mtime) (show maction)
showAppState ASTerminated = pure "terminated"