module Main (
main
) where
import Data.Generics ( mkT, everywhere )
import Data.Monoid ( Monoid(..) )
import Language.Haskell.Preprocessor ( Extension(..)
, Ast(..), Token(..), Tag(..)
, transform, base )
import System.Environment ( getArgs )
import Text.Regex.Posix ( (=~) )
extension :: Extension
extension = interpolExt `mappend` base
interpolExt :: Extension
interpolExt = mempty { transformer = everywhere (mkT trans) }
where
trans :: Ast -> Ast
trans Single{item = tok@Token{tag = StringLit, val = s}} =
let s' = '(' : concat (unsafeInterpol $ ti s) ++ ")"
in Single tok{ val = s' }
trans ast = ast
ti = tail . init
identRE = "\\{[A-z_][A-z0-9_]*}"
unsafeInterpol :: String -> [String]
unsafeInterpol s =
let (before, ident, after) = s =~ identRE
in case ident of
"" -> [norm before]
_ -> norm before : showIdent ident : unsafeInterpol after
showIdent "" = ""
showIdent i = concat [" ++ show ", ti i, " ++ "]
norm "" = "\"\""
norm s = '"' : s ++ "\""
main :: IO ()
main = transform extension =<< getArgs