module Data.UUID.Quasi (uuid) where
import qualified Data.UUID as U
import Language.Haskell.TH.Lib
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
uuidWords :: String -> Q [Lit]
uuidWords uuidStr =
case U.fromString uuidStr of
Nothing -> fail "not a valid UUID"
Just u ->
case U.toWords u of
(w1,w2,w3,w4) ->
return $ map (IntegerL . toInteger) [w1,w2,w3,w4]
expUUID :: String -> Q Exp
expUUID uuidStr = do
wds <- uuidWords uuidStr
let litNums = map LitE wds
fromExp <- varE 'U.fromWords
return $ foldl AppE fromExp litNums
patUUID :: String -> Q Pat
patUUID uuidStr = do
wds <- uuidWords uuidStr
let patNums = map LitP wds
patTup = TupP patNums
toExp <- varE 'U.toWords
return $ ViewP toExp patTup
uuid :: QuasiQuoter
uuid = QuasiQuoter
{ quoteExp = expUUID
, quotePat = patUUID
}