@@ -161,20 +161,13 @@ import Streamly.Internal.Data.Strict (Tuple3'(..))
162{-# ANN type Step Fuse #-}
162{-# ANN type Step Fuse #-}
163data Step s b =
163data Step s b =
165− -- ^ Trim the backtracking buffer keeping only most recent @n@ items.
166− -- @Yield n state@ indicates that the parser has yielded a new result
167− -- which is a point of no return. The result can be extracted using
168− -- @extract@. The driver drops the buffer except @n@ most recent
169− -- elements. The rule is that if a parser has yielded at least once it
170− -- cannot return a failure result.
172− | YieldB Int s
164+ Yield Int s
173 -- ^ Go back by @n@ items in the input buffer and drop the rest.
165 -- ^ Go back by @n@ items in the input buffer and drop the rest.
174− -- @YieldB n state@ indicates that the parser has yielded a new result
166+ -- @Yield n state@ indicates that the parser has yielded a new result
175 -- which is a point of no return. The result can be extracted using
167 -- which is a point of no return. The result can be extracted using
176 -- @extract@. The driver moves back the current position of the cursor by
168 -- @extract@. The driver moves back the current position of the cursor by
177− -- @n@ elements and drops any buffer before that.
169+ -- @n@ elements and drops any buffer before that. The rule is that if a
170+ -- parser has yielded at least once it cannot return a failure result.
179 -- only rewind
172 -- only rewind
180 | Skip Int s
173 | Skip Int s
@@ -202,7 +195,6 @@ data Step s b =
202instance Functor (Step s) where
195instance Functor (Step s) where
203 {-# INLINE fmap #-}
196 {-# INLINE fmap #-}
204 fmap _ (Yield n s) = Yield n s
197 fmap _ (Yield n s) = Yield n s
205− fmap _ (YieldB n s) = YieldB n s
206 fmap _ (Skip n s) = Skip n s
198 fmap _ (Skip n s) = Skip n s
207 fmap f (Stop n b) = Stop n (f b)
199 fmap f (Stop n b) = Stop n (f b)
208 fmap _ (Error err) = Error err
200 fmap _ (Error err) = Error err
@@ -303,8 +295,7 @@ splitWith func (Parser stepL initialL extractL)
303 -- e.g. in ((,) <$> p1 <*> p2) <|> p3, if p2 fails we have to
295 -- e.g. in ((,) <$> p1 <*> p2) <|> p3, if p2 fails we have to
304 -- backtrack and start running p3. So we need to keep the input
296 -- backtrack and start running p3. So we need to keep the input
305 -- buffered until we know that the applicative cannot fail.
297 -- buffered until we know that the applicative cannot fail.
306− Yield _ s -> return $ Skip 0 (SeqParseL s)
307− YieldB n s -> return $ Skip n (SeqParseL s)
298+ Yield n s -> return $ Skip n (SeqParseL s)
308 Skip n s -> return $ Skip n (SeqParseL s)
299 Skip n s -> return $ Skip n (SeqParseL s)
309 Stop n b -> Skip n <$> (SeqParseR (func b) <$> initialR)
300 Stop n b -> Skip n <$> (SeqParseR (func b) <$> initialR)
310 Error err -> return $ Error err
301 Error err -> return $ Error err
@@ -313,7 +304,6 @@ splitWith func (Parser stepL initialL extractL)
313 r <- stepR st a
304 r <- stepR st a
314 return $ case r of
305 return $ case r of
315 Yield n s -> Yield n (SeqParseR f s)
306 Yield n s -> Yield n (SeqParseR f s)
316− YieldB n s -> YieldB n (SeqParseR f s)
317 Skip n s -> Skip n (SeqParseR f s)
307 Skip n s -> Skip n (SeqParseR f s)
318 Stop n b -> Stop n (f b)
308 Stop n b -> Stop n (f b)
319 Error err -> Error err
309 Error err -> Error err
@@ -348,8 +338,7 @@ split_ (Parser stepL initialL extractL) (Parser stepR initialR extractR) =
348 (\r i -> case r of
338 (\r i -> case r of
349 -- Note: this leads to buffering even if we are not in an
339 -- Note: this leads to buffering even if we are not in an
350 -- Alternative composition.
340 -- Alternative composition.
351− Yield _ s -> Skip 0 (SeqAL s)
352− YieldB n s -> Skip n (SeqAL s)
341+ Yield n s -> Skip n (SeqAL s)
353 Skip n s -> Skip n (SeqAL s)
342 Skip n s -> Skip n (SeqAL s)
354 Stop n _ -> Skip n (SeqAR i)
343 Stop n _ -> Skip n (SeqAR i)
355 -- XXX should we sequence initialR monadically?
344 -- XXX should we sequence initialR monadically?
@@ -358,7 +347,6 @@ split_ (Parser stepL initialL extractL) (Parser stepR initialR extractR) =
358 step (SeqAR st) a = do
347 step (SeqAR st) a = do
359 (\r -> case r of
348 (\r -> case r of
360 Yield n s -> Yield n (SeqAR s)
349 Yield n s -> Yield n (SeqAR s)
361− YieldB n s -> YieldB n (SeqAR s)
362 Skip n s -> Skip n (SeqAR s)
350 Skip n s -> Skip n (SeqAR s)
363 Stop n b -> Stop n b
351 Stop n b -> Stop n b
364 Error err -> Error err) <$> stepR st a
352 Error err -> Error err) <$> stepR st a
@@ -413,7 +401,6 @@ alt (Parser stepL initialL extractL) (Parser stepR initialR extractR) =
413 r <- stepL st a
401 r <- stepL st a
414 case r of
402 case r of
415 Yield n s -> return $ Yield n (AltParseL 0 s)
403 Yield n s -> return $ Yield n (AltParseL 0 s)
416− YieldB n s -> return $ YieldB n (AltParseL 0 s)
417 Skip n s -> do
404 Skip n s -> do
418 assert (cnt + 1 - n >= 0) (return ())
405 assert (cnt + 1 - n >= 0) (return ())
419 return $ Skip n (AltParseL (cnt + 1 - n) s)
406 return $ Skip n (AltParseL (cnt + 1 - n) s)
@@ -426,7 +413,6 @@ alt (Parser stepL initialL extractL) (Parser stepR initialR extractR) =
426 r <- stepR st a
413 r <- stepR st a
427 return $ case r of
414 return $ case r of
428 Yield n s -> Yield n (AltParseR s)
415 Yield n s -> Yield n (AltParseR s)
429− YieldB n s -> YieldB n (AltParseR s)
430 Skip n s -> Skip n (AltParseR s)
416 Skip n s -> Skip n (AltParseR s)
431 Stop n b -> Stop n b
417 Stop n b -> Stop n b
432 Error err -> Error err
418 Error err -> Error err
@@ -455,8 +441,7 @@ splitMany (Fold fstep finitial fextract) (Parser step1 initial1 extract1) =
455 r <- step1 st a
441 r <- step1 st a
456 let cnt1 = cnt + 1
442 let cnt1 = cnt + 1
457 case r of
443 case r of
458− Yield _ s -> return $ Skip 0 (Tuple3' s cnt1 fs)
459− YieldB n s -> do
444+ Yield n s -> do
460 assert (cnt1 - n >= 0) (return ())
445 assert (cnt1 - n >= 0) (return ())
461 return $ Skip n (Tuple3' s (cnt1 - n) fs)
446 return $ Skip n (Tuple3' s (cnt1 - n) fs)
462 Skip n s -> do
447 Skip n s -> do
@@ -465,7 +450,7 @@ splitMany (Fold fstep finitial fextract) (Parser step1 initial1 extract1) =
465 Stop n b -> do
450 Stop n b -> do
466 s <- initial1
451 s <- initial1
467 fs1 <- fstep fs b
452 fs1 <- fstep fs b
468− return $ YieldB n (Tuple3' s 0 fs1)
453+ return $ Yield n (Tuple3' s 0 fs1)
469 Error _ -> do
454 Error _ -> do
470 xs <- fextract fs
455 xs <- fextract fs
471 return $ Stop cnt1 xs
456 return $ Stop cnt1 xs
@@ -497,29 +482,27 @@ splitSome (Fold fstep finitial fextract) (Parser step1 initial1 extract1) =
497 step (Tuple3' st _ (Left fs)) a = do
482 step (Tuple3' st _ (Left fs)) a = do
498 r <- step1 st a
483 r <- step1 st a
499 case r of
484 case r of
500− Yield _ s -> return $ Skip 0 (Tuple3' s undefined (Left fs))
501− YieldB n s -> return $ Skip n (Tuple3' s undefined (Left fs))
485+ Yield n s -> return $ Skip n (Tuple3' s undefined (Left fs))
502 Skip n s -> return $ Skip n (Tuple3' s undefined (Left fs))
486 Skip n s -> return $ Skip n (Tuple3' s undefined (Left fs))
503 Stop n b -> do
487 Stop n b -> do
504 s <- initial1
488 s <- initial1
505 fs1 <- fstep fs b
489 fs1 <- fstep fs b
506− return $ YieldB n (Tuple3' s 0 (Right fs1))
490+ return $ Yield n (Tuple3' s 0 (Right fs1))
507 Error err -> return $ Error err
491 Error err -> return $ Error err
508 step (Tuple3' st cnt (Right fs)) a = do
492 step (Tuple3' st cnt (Right fs)) a = do
509 r <- step1 st a
493 r <- step1 st a
510 let cnt1 = cnt + 1
494 let cnt1 = cnt + 1
511 case r of
495 case r of
512− Yield _ s -> return $ Yield 0 (Tuple3' s cnt1 (Right fs))
513− YieldB n s -> do
496+ Yield n s -> do
514 assert (cnt1 - n >= 0) (return ())
497 assert (cnt1 - n >= 0) (return ())
515− return $ YieldB n (Tuple3' s (cnt1 - n) (Right fs))
498+ return $ Yield n (Tuple3' s (cnt1 - n) (Right fs))
516 Skip n s -> do
499 Skip n s -> do
517 assert (cnt1 - n >= 0) (return ())
500 assert (cnt1 - n >= 0) (return ())
518 return $ Skip n (Tuple3' s (cnt1 - n) (Right fs))
501 return $ Skip n (Tuple3' s (cnt1 - n) (Right fs))
519 Stop n b -> do
502 Stop n b -> do
520 s <- initial1
503 s <- initial1
521 fs1 <- fstep fs b
504 fs1 <- fstep fs b
522− return $ YieldB n (Tuple3' s 0 (Right fs1))
505+ return $ Yield n (Tuple3' s 0 (Right fs1))
523 Error _ -> Stop cnt1 <$> fextract fs
506 Error _ -> Stop cnt1 <$> fextract fs
525 -- XXX The "try" may impact performance if this parser is used as a scan
508 -- XXX The "try" may impact performance if this parser is used as a scan
@@ -598,8 +581,7 @@ concatMap func (Parser stepL initialL extractL) = Parser step initial extract
598 step (ConcatParseL st) a = do
581 step (ConcatParseL st) a = do
599 r <- stepL st a
582 r <- stepL st a
600 return $ case r of
583 return $ case r of
601− Yield _ s -> Skip 0 (ConcatParseL s)
602− YieldB n s -> Skip n (ConcatParseL s)
584+ Yield n s -> Skip n (ConcatParseL s)
603 Skip n s -> Skip n (ConcatParseL s)
585 Skip n s -> Skip n (ConcatParseL s)
604 Stop n b -> Skip n (ConcatParseR (func b))
586 Stop n b -> Skip n (ConcatParseR (func b))
605 Error err -> Error err
587 Error err -> Error err
@@ -610,8 +592,6 @@ concatMap func (Parser stepL initialL extractL) = Parser step initial extract
610 return $ case r of
592 return $ case r of
611 Yield n s ->
593 Yield n s ->
612 Yield n (ConcatParseR (Parser stepR (return s) extractR))
594 Yield n (ConcatParseR (Parser stepR (return s) extractR))
614− YieldB n (ConcatParseR (Parser stepR (return s) extractR))
615 Skip n s ->
595 Skip n s ->
616 Skip n (ConcatParseR (Parser stepR (return s) extractR))
596 Skip n (ConcatParseR (Parser stepR (return s) extractR))
617 Stop n b -> Stop n b
597 Stop n b -> Stop n b