{-# LANGUAGE TemplateHaskell #-}
module Data.Time.Zones.TH (
includeTZFromDB,
includeSystemTZ,
includeTZFromFile,
) where
import Control.DeepSeq
import qualified Data.ByteString.Lazy.Char8 as BL
import Data.Time.Zones.Files
import Data.Time.Zones.Read
import Language.Haskell.TH
includeTZFromDB :: String -> Q Exp
includeTZFromDB :: String -> Q Exp
includeTZFromDB String
tzName = do
ByteString
desc <- IO ByteString -> Q ByteString
forall a. IO a -> Q a
runIO (IO ByteString -> Q ByteString) -> IO ByteString -> Q ByteString
forall a b. (a -> b) -> a -> b
$ String -> IO String
timeZonePathFromDB String
tzName IO String -> (String -> IO ByteString) -> IO ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ByteString
BL.readFile
ByteString -> Q Exp
parseTZ ByteString
desc
includeSystemTZ :: String -> Q Exp
includeSystemTZ :: String -> Q Exp
includeSystemTZ String
tzName = do
ByteString
desc <- IO ByteString -> Q ByteString
forall a. IO a -> Q a
runIO (IO ByteString -> Q ByteString) -> IO ByteString -> Q ByteString
forall a b. (a -> b) -> a -> b
$ String -> IO String
pathForSystemTZ String
tzName IO String -> (String -> IO ByteString) -> IO ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ByteString
BL.readFile
ByteString -> Q Exp
parseTZ ByteString
desc
includeTZFromFile :: FilePath -> Q Exp
includeTZFromFile :: String -> Q Exp
includeTZFromFile String
fname = do
ByteString
desc <- IO ByteString -> Q ByteString
forall a. IO a -> Q a
runIO (IO ByteString -> Q ByteString) -> IO ByteString -> Q ByteString
forall a b. (a -> b) -> a -> b
$ String -> IO ByteString
BL.readFile String
fname
ByteString -> Q Exp
parseTZ ByteString
desc
parseTZ :: BL.ByteString -> Q Exp
parseTZ :: ByteString -> Q Exp
parseTZ ByteString
desc = do
ByteString -> TZ
parseOlson ByteString
desc TZ -> Q () -> Q ()
forall a b. NFData a => a -> b -> b
`deepseq` () -> Q ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
[| parseOlson (BL.pack $(stringE $ BL.unpack desc)) |]