{-# LANGUAGE FlexibleInstances #-}

-- | A lot of quasiquoters to format and interpolate string expression
module PyF
  ( fmt,

    -- * With custom delimiters
    fmtWithDelimiters,
    module PyF.Class,
  )
where

import Language.Haskell.TH.Quote (QuasiQuoter (..))
import PyF.Class
import PyF.Internal.QQ (toExp)

templateF :: (Char, Char) -> String -> QuasiQuoter
templateF :: (Char, Char) -> String -> QuasiQuoter
templateF (Char, Char)
delimiters String
fName =
  QuasiQuoter :: (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter
    { quoteExp :: String -> Q Exp
quoteExp = (Char, Char) -> String -> Q Exp
toExp (Char, Char)
delimiters,
      quotePat :: String -> Q Pat
quotePat = String -> String -> Q Pat
forall a. String -> a
err String
"pattern",
      quoteType :: String -> Q Type
quoteType = String -> String -> Q Type
forall a. String -> a
err String
"type",
      quoteDec :: String -> Q [Dec]
quoteDec = String -> String -> Q [Dec]
forall a. String -> a
err String
"declaration"
    }
  where
    err :: String -> a
err String
name = String -> a
forall a. HasCallStack => String -> a
error (String
fName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": This QuasiQuoter can not be used as a " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"!")

-- | Generic formatter, can format an expression to any @t@ as long as
--   @t@ is an instance of 'IsString'.
fmt :: QuasiQuoter
fmt :: QuasiQuoter
fmt = (Char, Char) -> String -> QuasiQuoter
templateF (Char, Char)
pythonDelimiters String
"fmt"

fmtWithDelimiters :: (Char, Char) -> QuasiQuoter
fmtWithDelimiters :: (Char, Char) -> QuasiQuoter
fmtWithDelimiters (Char, Char)
delimiters = (Char, Char) -> String -> QuasiQuoter
templateF (Char, Char)
delimiters String
"fmtWithDelimiters"

pythonDelimiters :: (Char, Char)
pythonDelimiters :: (Char, Char)
pythonDelimiters = (Char
'{', Char
'}')