commit 349fe18411a6c293b1d43bb8b72f28cc00f5e02d
parent e39356d9a44f8894342a7f3d430fbddcbdf67369
Author: Robert Russell <robert@rr3.xyz>
Date: Tue, 27 Aug 2024 03:45:47 -0700
Make bytesOf and spanOf modify parser state
... and as a result fix a bug in ruleWhileM.
Diffstat:
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/Sparsec.hs b/Sparsec.hs
@@ -213,14 +213,19 @@ lookahead p = do
load s
pure a
-spanOf :: Monad m => ParseT e m a -> ParseT e m Span
-spanOf p = Span <$> getLoc <*> lookahead (p *> getLoc)
+spanOf :: Monad m => ParseT e m a -> ParseT e m (a, Span)
+spanOf p = do
+ beg <- getLoc
+ a <- p
+ end <- getLoc
+ pure (a, Span beg end)
-bytesOf :: Monad m => ParseT e m a -> ParseT e m ByteString
+bytesOf :: Monad m => ParseT e m a -> ParseT e m (a, ByteString)
bytesOf p = do
(input, beg) <- save
- end <- lookahead (p *> getLoc)
- pure $ ByteString.drop (end.byte - beg.byte) input
+ a <- p
+ end <- getLoc
+ pure (a, ByteString.take (end.byte - beg.byte) input)
-- Convert a failure into an error.
-- TODO: Why do we call this "cut"?
@@ -306,7 +311,7 @@ charIf :: (Utf8Error e, Monad m) => (Char -> Bool) -> ParseT e m Char
charIf want = charIfM (pure . want)
runeWhileM :: (Utf8Error e, Monad m) => (Rune -> m Bool) -> ParseT e m ByteString
-runeWhileM want = bytesOf $ many (runeIfM want)
+runeWhileM want = snd <$> (bytesOf $ many (runeIfM want))
runeWhile :: (Utf8Error e, Monad m) => (Rune -> Bool) -> ParseT e m ByteString
runeWhile want = runeWhileM (pure . want)