module Logging.Utils ( addZonedTime , diffZonedTime , zonedTimeToPOSIXSeconds , timestamp , seconds , milliseconds , microseconds , openLogFile ) where import Data.Time.Clock import Data.Time.Clock.POSIX import Data.Time.LocalTime import System.Directory import System.Environment import System.FilePath import System.IO addZonedTime :: NominalDiffTime -> ZonedTime -> ZonedTime addZonedTime ndt zt@(ZonedTime _ tz) = utcToZonedTime tz $ addUTCTime ndt $ zonedTimeToUTC zt diffZonedTime :: ZonedTime -> ZonedTime -> NominalDiffTime diffZonedTime zt1 zt2 = diffUTCTime (zonedTimeToUTC zt1) (zonedTimeToUTC zt2) zonedTimeToPOSIXSeconds :: ZonedTime -> NominalDiffTime zonedTimeToPOSIXSeconds = utcTimeToPOSIXSeconds . zonedTimeToUTC timestamp :: NominalDiffTime -> Double timestamp = fromRational . toRational seconds :: NominalDiffTime -> Integer seconds = truncate milliseconds :: NominalDiffTime -> Integer milliseconds = truncate . (* 1000) microseconds :: NominalDiffTime -> Integer microseconds = truncate . (* 1000000) openLogFile :: FilePath -> TextEncoding -> IO Handle openLogFile path encoding = do absPath <- makeAbsolute path progName <- getProgName let dir = takeDirectory absPath file = if dir == absPath then dir (progName ++ ".log") else absPath createDirectoryIfMissing True dir stream <- openFile file AppendMode hSetEncoding stream encoding return stream