packages feed

mighttpd2-2.3.0: Log/Date.hs

module Log.Date (dateInit, getDate, DateRef) where

import Control.Applicative
import Control.Concurrent
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS
import Data.IORef
import Data.Time
import System.Locale

newtype DateRef = DateRef (IORef ByteString)

getDate :: DateRef -> IO ByteString
getDate (DateRef ref) = readIORef ref

dateInit :: IO DateRef
dateInit = do
    ref <- formatDate >>= newIORef
    let dateref = DateRef ref
    forkIO $ date dateref
    return dateref

date :: DateRef -> IO ()
date dateref@(DateRef ref) = do
    tmstr <- formatDate
    atomicModifyIORef ref (\_ -> (tmstr, ()))
    threadDelay 1000000
    date dateref

formatDate :: IO ByteString
formatDate =
    BS.pack . formatTime defaultTimeLocale "%d/%b/%Y:%T %z" <$> getZonedTime