{-# LANGUAGE TemplateHaskell #-}
module TemplateHaskell.Foo where

import Language.Haskell.TH
import Text.Printf

-- | Report an error.
--
-- >>> :set -XTemplateHaskell
-- >>> $(logError "Something bad happened!")
-- ERROR <interactive>: Something bad happened!
logError :: String -> Q Exp
logError :: String -> Q Exp
logError String
msg = do
  Loc
loc <- Q Loc
location
  let s :: String
s = (String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"ERROR %s: %s" (Loc -> String
loc_filename Loc
loc) String
msg) :: String
  [| putStrLn s |]