module ALife.Creatur.Logger.SimpleLogger
(
SimpleLogger,
mkSimpleLogger
) where
import ALife.Creatur.Util (getLift)
import ALife.Creatur.Logger (Logger(..), timestamp)
import Control.Conditional (unlessM)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.State (StateT, gets, modify)
import System.Directory (createDirectoryIfMissing)
import System.FilePath (splitFileName)
data SimpleLogger = SimpleLogger {
initialised :: Bool,
logFilename :: FilePath
} deriving (Show, Eq)
mkSimpleLogger :: FilePath -> SimpleLogger
mkSimpleLogger f = SimpleLogger False f
instance Logger SimpleLogger where
writeToLog msg = do
initIfNeeded
getLift $ write' msg
initIfNeeded :: StateT SimpleLogger IO ()
initIfNeeded =
unlessM (gets initialised) initialise
initialise :: StateT SimpleLogger IO ()
initialise = do
(d,_) <- fmap splitFileName $ gets logFilename
liftIO $ createDirectoryIfMissing True d
modify (\l -> l { initialised=True } )
write' :: String -> SimpleLogger -> IO ()
write' msg logger = do
ts <- timestamp
appendFile (logFilename logger) $ ts ++ "\t" ++ msg ++ "\n"