
{-# OPTIONS -fglasgow-exts #-}

module Interpolate where

import Text.ParserCombinators.Parsec
import Language.Haskell.TH

interp s = do
    parts <- case parse (do ps <- many interp_part; eof; return ps) s s of
        Left err -> fail (show err)
        Right x -> return x
    [| concat $(return (ListE parts)) |]

interp_part =
    choice
        [do char '%'
            choice
                [do char '%'
                    return (LitE (StringL "%"))
                ,do char '{'
                    name <- many1 (noneOf "}")
                    char '}'
                    return (VarE (mkName name))
                ]
        ,do cs <- many1 (noneOf "%")
            return (LitE (StringL cs))
        ]

