{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Text.Nowdoc (nowdoc) where

import Language.Haskell.TH (litE, stringL)
import Language.Haskell.TH.Quote (QuasiQuoter(..))

nowdoc :: QuasiQuoter
nowdoc = QuasiQuoter {
        quoteExp = litE . stringL . unescape . dropHeadNewline,
        quotePat = const . error $ errorString "a pattern",
        quoteType = const . error $ errorString "a type",
        quoteDec = const . error $ errorString "a declaration"
        }

errorString :: String -> String
errorString ctx =
        "You have used the `nowdoc' QuasiQoter in " ++ ctx ++
        " context; you must only use it in an expression context"

dropHeadNewline :: String -> String
dropHeadNewline ('\n' : cs) = cs
dropHeadNewline cs = cs

unescape :: String -> String
unescape ('|' : cs) = case span (== ' ') cs of
        (_ : ss, ']' : cs') -> '|' : ss ++ "]" ++ unescape cs'
        (ss, cs') -> '|' : ss ++ unescape cs'
unescape (c : cs) = c : unescape cs
unescape "" = ""