module Data.RDF.Utils (
t2s, s2t, hPutStrRev, canonicalize
) where
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
import qualified Data.ByteString as B
import Data.Map(Map)
import qualified Data.Map as Map
import System.IO
t2s :: T.Text -> String
t2s = T.unpack
s2t :: String -> T.Text
s2t = T.pack
hPutStrRev :: Handle -> T.Text -> IO ()
hPutStrRev h bs = B.hPutStr h ((encodeUtf8 . T.reverse) bs)
canonicalize :: T.Text -> T.Text -> T.Text
canonicalize typeFs litValue =
case Map.lookup typeFs canonicalizerTable of
Nothing -> litValue
Just fn -> fn litValue
canonicalizerTable :: Map T.Text (T.Text -> T.Text)
canonicalizerTable =
Map.fromList [(integerUri, _integerStr), (doubleUri, _doubleStr),
(decimalUri, _decimalStr)]
where
integerUri = mkFsUri "http://www.w3.org/2001/XMLSchema#integer"
decimalUri = mkFsUri "http://www.w3.org/2001/XMLSchema#decimal"
doubleUri = mkFsUri "http://www.w3.org/2001/XMLSchema#double"
mkFsUri :: String -> T.Text
mkFsUri uri = s2t $! uri
_integerStr, _decimalStr, _doubleStr :: T.Text -> T.Text
_integerStr = T.dropWhile (== '0')
_doubleStr s = T.pack $ show (read $ T.unpack s :: Double)
_decimalStr s =
case T.last s of
'.' -> f (s `T.snoc` '0')
_ -> f s
where f s' = T.pack $ show (read $ T.unpack s' :: Double)