packages feed

easy-logger-0.1.0.0: src/EasyLogger/Date.hs

{-# LANGUAGE OverloadedStrings #-}
module EasyLogger.Date
    ( FormattedTime
    , TimeFormat
    , newTimeCache
    , simpleTimeFormat
    , simpleTimeFormat'
    ) where

import           Control.AutoUpdate       (defaultUpdateSettings, mkAutoUpdate,
                                           updateAction)
import           Data.ByteString
import           Data.UnixTime            (formatUnixTime, fromEpochTime)
import           System.PosixCompat.Time  (epochTime)
import           System.PosixCompat.Types (EpochTime)


-- | Type aliaes for date format and formatted date.
type FormattedTime = ByteString
type TimeFormat = ByteString


----------------------------------------------------------------

-- | Get date using UnixTime.
getTime :: IO EpochTime
getTime = epochTime

-- | Format unix EpochTime date.
formatDate :: TimeFormat -> EpochTime -> IO FormattedTime
formatDate fmt = formatUnixTime fmt . fromEpochTime

----------------------------------------------------------------

-- |  Make 'IO' action which get cached formatted local time.
-- Use this to avoid the cost of frequently time formatting by caching an
-- auto updating formatted time, this cache update every 1 second.
-- more detail in "Control.AutoUpdate"
newTimeCache :: TimeFormat -> IO (IO FormattedTime)
newTimeCache fmt = mkAutoUpdate defaultUpdateSettings {updateAction = getTime >>= formatDate fmt}

-- | A simple time cache using format @"%d/%b/%Y:%T %z"@
simpleTimeFormat :: TimeFormat
simpleTimeFormat = "%d/%b/%Y:%T %z"

-- | A simple time cache using format @"%d-%b-%Y %T"@
simpleTimeFormat' :: TimeFormat
simpleTimeFormat' = "%d-%b-%Y %T"