{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} module Debug.Trace.Var (traceVar, traceVarId, traceStackVar, traceVarIO, traceVarM) where import Data.Maybe import Debug.Trace import Language.Haskell.TH import Language.Haskell.TH.Quote import Text.Show.Unicode traceVar :: QuasiQuoter traceVar = traceVarBase [|trace|] traceVarId :: QuasiQuoter traceVarId = traceVarBase [|traceId|] traceStackVar :: QuasiQuoter traceStackVar = traceVarBase [|traceStack|] traceVarIO :: QuasiQuoter traceVarIO = traceVarBase [|traceIO|] traceVarM :: QuasiQuoter traceVarM = traceVarBase [|traceM|] traceVarBase :: Q Exp -> QuasiQuoter traceVarBase traceFuncEQ = QuasiQuoter { quoteExp = \str -> AppE <$> traceFuncEQ <*> traceFormat str , quotePat = error "no support" , quoteType = error "no support" , quoteDec = error "no support" } traceFormat :: String -> Q Exp traceFormat str = do valueName <- fromMaybe (error $ "variable " ++ str ++ " is not found") <$> lookupValueName str concatE <- [|concat|] ushowE <- [|ushow|] return $ AppE concatE $ ListE [LitE (StringL str), LitE (StringL " = "), AppE ushowE (VarE valueName)]