sparsec

simple Haskell parser combinator library
git clone git://git.rr3.xyz/sparsec
Log | Files | Refs | README | LICENSE

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:
MSparsec.hs | 17+++++++++++------
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)