{-# LANGUAGE TemplateHaskell, CPP #-}
module Data.String.QQ (s) where
import GHC.Exts (IsString(..))
import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Quote
s :: QuasiQuoter
s :: QuasiQuoter
s = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter ((\String
a -> [|fromString a|]) (String -> Q Exp) -> (String -> String) -> String -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
trimLeadingNewline (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
removeCRs)
(String -> String -> Q Pat
forall a. HasCallStack => String -> a
error String
"Cannot use q as a pattern")
#if (__GLASGOW_HASKELL__ >= 700)
(String -> String -> Q Type
forall a. HasCallStack => String -> a
error String
"Cannot use q as a type")
(String -> String -> Q [Dec]
forall a. HasCallStack => String -> a
error String
"Cannot use q as a dec")
#endif
where
removeCRs :: String -> String
removeCRs = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'\r')
trimLeadingNewline :: String -> String
trimLeadingNewline (Char
'\n':String
xs) = String
xs
trimLeadingNewline String
xs = String
xs