{-# LANGUAGE TemplateHaskell #-}
module GHCup.Utils.String.QQ
  ( s
  )
where
import           Data.Char
import           GHC.Exts                       ( IsString(..) )
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
s' -> case (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isAscii String
s' of
    Bool
True  -> (\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 -> Q Exp) -> String -> Q Exp
forall a b. (a -> b) -> a -> b
$ String
s'
    Bool
False -> String -> Q Exp
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Not ascii"
  )
  (String -> String -> Q Pat
forall a. HasCallStack => String -> a
error String
"Cannot use s as a pattern")
  (String -> String -> Q Type
forall a. HasCallStack => String -> a
error String
"Cannot use s as a type")
  (String -> String -> Q [Dec]
forall a. HasCallStack => String -> a
error String
"Cannot use s as a dec")
 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