{-# LANGUAGE OverloadedStrings #-} module Bricks.Test.QQ ( text ) where -- Base import Control.Arrow ((>>>)) import Data.Function (const) -- Template Haskell import Language.Haskell.TH import Language.Haskell.TH.Quote -- Text import qualified Data.Text as Text text :: QuasiQuoter text = QuasiQuoter { quoteExp = pure . LitE . StringL . stripMargin , quotePat = err , quoteType = err , quoteDec = err } where err = const . fail $ "illegal text QuasiQuote (allowed as expression only)" stripMargin :: String -> String stripMargin = Text.pack >>> Text.splitOn "\n" >>> fmap (\x -> let (a, b) = Text.breakOn "┃" x in if Text.all (== ' ') a && not (Text.null b) then Text.drop 1 b else x) >>> Text.intercalate "\n" >>> Text.unpack