module Text.Trifecta.Parser.Layout.Combinators
( layoutEq
, disableLayout
, enableLayout
, laidout
) where
import Control.Applicative
import Control.Monad (guard)
import Text.Trifecta.Rope.Delta
import Text.Trifecta.Parser.Class
import Text.Trifecta.Parser.Token.Combinators
import qualified Text.Trifecta.Highlight.Prim as Highlight
import Text.Trifecta.Parser.Layout.Class
import Text.Trifecta.Parser.Layout.Prim
disableLayout :: MonadLayoutParser m => m a -> m a
disableLayout p = do
r <- rend
modLayout layoutStack (DisabledLayout r:)
result <- p
stk <- getLayout layoutStack
case stk of
DisabledLayout r':xs | delta r == delta r' -> result <$ setLayout layoutStack xs
_ -> unexpected "layout"
enableLayout :: MonadLayoutParser m => m a -> m a
enableLayout p = do
result <- highlight Highlight.Layout $ do
r <- rend
modLayout layoutStack (IndentedLayout r:)
p
result <$ layout <?> "virtual right brace"
laidout :: MonadLayoutParser m => m a -> m a
laidout p = braces p <|> enableLayout p
layoutEq :: MonadLayoutParser m => LayoutToken -> m LayoutToken
layoutEq s = try $ do
r <- layout
guard (s == r)
return r