here-1.0: src/Data/String/Here.hs
{-# OPTIONS_GHC -fno-warn-missing-fields #-}
-- | Here docs via quasiquotation
module Data.String.Here (here, hereLit) where
import Data.Char
import Language.Haskell.TH
import Language.Haskell.TH.Quote
-- | Quote a here doc, stripping leading and trailing whitespace
here :: QuasiQuoter
here = QuasiQuoter {quoteExp = stringE . trim}
-- | Quote a here doc literally, with no whitespace stripping
hereLit :: QuasiQuoter
hereLit = QuasiQuoter {quoteExp = stringE}
trim :: String -> String
trim = trimTail . dropWhile isSpace
trimTail :: String -> String
trimTail "" = ""
trimTail s = take (lastNonBlank s) s
where lastNonBlank = (+1) . fst . foldl acc (0, 0)
acc (l, n) c | isSpace c = (l, n + 1)
| otherwise = (n, n + 1)