packages feed

haskell-admin-health-1.0.0.0: src/Data/ApplicationState.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE LambdaCase #-}

module Data.ApplicationState
  ( ApplicationState(..)
  , stateOf
  ) where

import Control.Concurrent.Async (Async, poll)
import Control.Exception (SomeException)
import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics (Generic)

-- | The state of a running Haskell application
-- or an running 'Async' action
data ApplicationState
  = Running -- ^ Application (action) is running
  | Finished String -- ^ Result of the async action
  | Error String -- ^ Description of the error (exception)
  deriving (Read, Show, Eq, Generic, ToJSON, FromJSON)

-- | Yields the 'ApplicationState' of an 'Async'
stateOf :: (Show a) => Async a -> IO ApplicationState
stateOf x = fromPollResult <$> poll x

-- | Converts the result of a 'Control.Concurrent.Async.poll' call to 'ApplicationState'
fromPollResult :: (Show a) => Maybe (Either SomeException a) -> ApplicationState
fromPollResult =
  \case
    Nothing -> Running
    Just (Left err) -> Error (show err)
    Just (Right val) -> Finished (show val)