-- |
-- Module      :  Mcmc.Environment
-- Description :  Runtime environment
-- Copyright   :  (c) Dominik Schrempf, 2020
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Tue Nov 17 11:00:09 2020.
module Mcmc.Environment
  ( Environment (..),
    initializeEnvironment,
  )
where

import Data.Time.Clock
import Mcmc.Settings
import System.IO

-- | The environment of an MCMC run.
data Environment = Environment
  { Environment -> Settings
settings :: Settings,
    -- | We have to use 'Maybe' here, because we do not want to open any log
    -- file when being 'Quiet'.
    Environment -> Maybe Handle
logHandle :: Maybe Handle,
    -- | Used to calculate the ETA.
    Environment -> UTCTime
startingTime :: UTCTime
  }
  deriving (Environment -> Environment -> Bool
(Environment -> Environment -> Bool)
-> (Environment -> Environment -> Bool) -> Eq Environment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Environment -> Environment -> Bool
$c/= :: Environment -> Environment -> Bool
== :: Environment -> Environment -> Bool
$c== :: Environment -> Environment -> Bool
Eq, Int -> Environment -> ShowS
[Environment] -> ShowS
Environment -> String
(Int -> Environment -> ShowS)
-> (Environment -> String)
-> ([Environment] -> ShowS)
-> Show Environment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Environment] -> ShowS
$cshowList :: [Environment] -> ShowS
show :: Environment -> String
$cshow :: Environment -> String
showsPrec :: Int -> Environment -> ShowS
$cshowsPrec :: Int -> Environment -> ShowS
Show)

-- | Initialize the environment.
--
-- Open log file, get current time.
initializeEnvironment ::
  Settings ->
  IO Environment
initializeEnvironment :: Settings -> IO Environment
initializeEnvironment Settings
s = do
  UTCTime
t <- IO UTCTime
getCurrentTime
  Maybe Handle
mh <- case Settings -> Verbosity
sVerbosity Settings
s of
    Verbosity
Quiet -> Maybe Handle -> IO (Maybe Handle)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Handle
forall a. Maybe a
Nothing
    Verbosity
_ -> do
      Handle
h <- ExecutionMode -> String -> IO Handle
openWithExecutionMode ExecutionMode
em String
fn
      Maybe Handle -> IO (Maybe Handle)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Handle -> IO (Maybe Handle))
-> Maybe Handle -> IO (Maybe Handle)
forall a b. (a -> b) -> a -> b
$ Handle -> Maybe Handle
forall a. a -> Maybe a
Just Handle
h
  Environment -> IO Environment
forall (m :: * -> *) a. Monad m => a -> m a
return (Environment -> IO Environment) -> Environment -> IO Environment
forall a b. (a -> b) -> a -> b
$ Settings -> Maybe Handle -> UTCTime -> Environment
Environment Settings
s Maybe Handle
mh UTCTime
t
  where
    fn :: String
fn = AnalysisName -> String
fromAnalysisName (Settings -> AnalysisName
sAnalysisName Settings
s) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
".log"
    em :: ExecutionMode
em = Settings -> ExecutionMode
sExecutionMode Settings
s