Add quoteFile function (see Trac #4293)
authorsimonpj@microsoft.com <unknown>
Fri, 10 Sep 2010 08:20:16 +0000 (08:20 +0000)
committersimonpj@microsoft.com <unknown>
Fri, 10 Sep 2010 08:20:16 +0000 (08:20 +0000)
Language/Haskell/TH/Quote.hs

index 4470215..80c6def 100644 (file)
@@ -1,7 +1,8 @@
 {-# LANGUAGE RankNTypes, ScopedTypeVariables #-}
 module Language.Haskell.TH.Quote(
        QuasiQuoter(..),
-        dataToQa, dataToExpQ, dataToPatQ
+        dataToQa, dataToExpQ, dataToPatQ,
+        quoteFile
     ) where
 
 import Data.Data
@@ -62,3 +63,17 @@ dataToPatQ  ::  Data a
             ->  a
             ->  Q Pat
 dataToPatQ = dataToQa id litP conP
+
+-- | 'quoteFile' takes a 'QuasiQuoter' and lifts it into one that read
+-- the data out of a file.  For example, suppose 'asmq' is an 
+-- assembly-language quoter, so that you can write [asmq| ld r1, r2 |]
+-- as an expression. Then if you define @asmq_f = quoteFile asmq@, then
+-- the quote [asmq_f| foo.s |] will take input from file "foo.s" instead
+-- of the inline text
+quoteFile :: QuasiQuoter -> QuasiQuoter
+quoteFile (QuasiQuoter { quoteExp = qe, quotePat = qp, quoteType = qt, quoteDec = qd }) 
+  = QuasiQuoter { quoteExp = get qe, quotePat = get qp, quoteType = get qt, quoteDec = get qd }
+  where
+   get :: (String -> Q a) -> String -> Q a
+   get old_quoter file_name = do { file_cts <- runIO (readFile file_name) 
+                                 ; old_quoter file_cts }