1{-# LANGUAGE TemplateHaskell #-}
2module QQ (str) where
3
4import Language.Haskell.TH
5    ( mkName,
6      stringL,
7      litP,
8      clause,
9      litE,
10      normalB,
11      funD,
12      sigD,
13      litT,
14      strTyLit )
15import Language.Haskell.TH.Quote (QuasiQuoter (..))
16
17str :: QuasiQuoter
18str =
19    QuasiQuoter
20        { quoteExp = litE . stringL
21        , quotePat = litP . stringL
22        , quoteType = litT . strTyLit
23        , quoteDec = \name ->
24            sequence
25                [ sigD (mkName name) [t|String|]
26                , funD (mkName name) [clause [] (normalB $ litE $ stringL name) []]
27                ]
28        }
29