@@ -208,7 +208,6 @@ import Control.Monad.IO.Class (MonadIO, liftIO)
208208import Data.Bifunctor (Bifunctor(..))
209209import Fusion.Plugin.Types (Fuse(..))
210210import Streamly.Internal.Data.Fold.Type (Fold(..), toList)
211−import Streamly.Internal.Data.Tuple.Strict (Tuple3'(..))
212211
213212import qualified Control.Monad.Fail as Fail
214213import qualified Streamly.Internal.Data.Fold.Type as FL
@@ -922,12 +921,15 @@ alt (Parser stepL initialL extractL) (Parser stepR initialR extractR) =
922921 assertM(n == cnt)
923922 return $ Continue n (AltParseL 0 s)
924923
924+{-# ANN type Fused3 Fuse #-}
925+data Fused3 a b c = Fused3 !a !b !c
926+
925927-- | See documentation of 'Streamly.Internal.Data.Parser.many'.
926928--
927929-- /Pre-release/
928930--
929931{-# INLINE splitMany #-}
930−splitMany :: Monad m => Parser a m b -> Fold m b c -> Parser a m c
932+splitMany :: Monad m => Parser a m b -> Fold m b c -> Parser a m c
931933splitMany (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
932934 Parser step initial extract
933935
@@ -941,7 +943,7 @@ splitMany (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
941943 FL.Partial fs -> do
942944 pres <- initial1
943945 case pres of
944− IPartial ps -> return $ partial $ Tuple3' ps 0 fs
946+ IPartial ps -> return $ partial $ Fused3 ps 0 fs
945947 IDone pb ->
946948 runCollectorWith (handleCollect partial done) fs pb
947949 IError _ -> done <$> fextract fs
@@ -949,28 +951,30 @@ splitMany (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
949951
950952 runCollectorWith cont fs pb = fstep fs pb >>= cont
951953
954+ -- See notes in Fold.many for the reason why the parser must be initialized
955+ -- right away instead of on first input.
952956 initial = finitial >>= handleCollect IPartial IDone
953957
954958 {-# INLINE step #-}
955− step (Tuple3' st cnt fs) a = do
959+ step (Fused3 st cnt fs) a = do
956960 r <- step1 st a
957961 let cnt1 = cnt + 1
958962 case r of
959963 Partial n s -> do
960964 assertM(cnt1 - n >= 0)
961− return $ Continue n (Tuple3' s (cnt1 - n) fs)
965+ return $ Continue n (Fused3 s (cnt1 - n) fs)
962966 Continue n s -> do
963967 assertM(cnt1 - n >= 0)
964− return $ Continue n (Tuple3' s (cnt1 - n) fs)
968+ return $ Continue n (Fused3 s (cnt1 - n) fs)
965969 Done n b -> do
966970 assertM(cnt1 - n >= 0)
967971 fstep fs b >>= handleCollect (Partial n) (Done n)
968972 Error _ -> do
969973 xs <- fextract fs
970− return $ Done cnt1 xs
974+ return $ Done cnt xs
971975
972− extract (Tuple3' _ 0 fs) = fmap (Done 0) (fextract fs)
973− extract (Tuple3' s cnt fs) = do
976+ extract (Fused3 _ 0 fs) = fmap (Done 0) (fextract fs)
977+ extract (Fused3 s cnt fs) = do
974978 r <- extract1 s
975979 case r of
976980 Error _ -> fmap (Done cnt) (fextract fs)
@@ -983,7 +987,7 @@ splitMany (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
983987 Partial _ _ -> error "splitMany: Partial in extract"
984988 Continue n s1 -> do
985989 assertM(n == cnt)
986− return (Continue n (Tuple3' s1 0 fs))
990+ return (Continue n (Fused3 s1 0 fs))
987991
988992-- | Like splitMany, but inner fold emits an output at the end even if no input
989993-- is received.
@@ -1005,7 +1009,7 @@ splitManyPost (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10051009 FL.Partial fs -> do
10061010 pres <- initial1
10071011 case pres of
1008− IPartial ps -> return $ partial $ Tuple3' ps 0 fs
1012+ IPartial ps -> return $ partial $ Fused3 ps 0 fs
10091013 IDone pb ->
10101014 runCollectorWith (handleCollect partial done) fs pb
10111015 IError _ -> done <$> fextract fs
@@ -1016,16 +1020,16 @@ splitManyPost (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10161020 initial = finitial >>= handleCollect IPartial IDone
10171021
10181022 {-# INLINE step #-}
1019− step (Tuple3' st cnt fs) a = do
1023+ step (Fused3 st cnt fs) a = do
10201024 r <- step1 st a
10211025 let cnt1 = cnt + 1
10221026 case r of
10231027 Partial n s -> do
10241028 assertM(cnt1 - n >= 0)
1025− return $ Continue n (Tuple3' s (cnt1 - n) fs)
1029+ return $ Continue n (Fused3 s (cnt1 - n) fs)
10261030 Continue n s -> do
10271031 assertM(cnt1 - n >= 0)
1028− return $ Continue n (Tuple3' s (cnt1 - n) fs)
1032+ return $ Continue n (Fused3 s (cnt1 - n) fs)
10291033 Done n b -> do
10301034 assertM(cnt1 - n >= 0)
10311035 fstep fs b >>= handleCollect (Partial n) (Done n)
@@ -1033,7 +1037,7 @@ splitManyPost (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10331037 xs <- fextract fs
10341038 return $ Done cnt1 xs
10351039
1036− extract (Tuple3' s cnt fs) = do
1040+ extract (Fused3 s cnt fs) = do
10371041 r <- extract1 s
10381042 case r of
10391043 Error _ -> fmap (Done cnt) (fextract fs)
@@ -1046,7 +1050,7 @@ splitManyPost (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10461050 Partial _ _ -> error "splitMany: Partial in extract"
10471051 Continue n s1 -> do
10481052 assertM(n == cnt)
1049− return (Continue n (Tuple3' s1 0 fs))
1053+ return (Continue n (Fused3 s1 0 fs))
10501054
10511055-- | See documentation of 'Streamly.Internal.Data.Parser.some'.
10521056--
@@ -1067,7 +1071,7 @@ splitSome (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10671071 FL.Partial fs -> do
10681072 pres <- initial1
10691073 case pres of
1070− IPartial ps -> return $ partial $ Tuple3' ps 0 $ Right fs
1074+ IPartial ps -> return $ partial $ Fused3 ps 0 $ Right fs
10711075 IDone pb ->
10721076 runCollectorWith (handleCollect partial done) fs pb
10731077 IError _ -> done <$> fextract fs
@@ -1081,7 +1085,7 @@ splitSome (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10811085 FL.Partial fs -> do
10821086 pres <- initial1
10831087 case pres of
1084− IPartial ps -> return $ IPartial $ Tuple3' ps 0 $ Left fs
1088+ IPartial ps -> return $ IPartial $ Fused3 ps 0 $ Left fs
10851089 IDone pb ->
10861090 runCollectorWith (handleCollect IPartial IDone) fs pb
10871091 IError err -> return $ IError err
@@ -1092,37 +1096,37 @@ splitSome (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
10921096 ++ " consuming any elements."
10931097
10941098 {-# INLINE step #-}
1095− step (Tuple3' st cnt (Left fs)) a = do
1099+ step (Fused3 st cnt (Left fs)) a = do
10961100 r <- step1 st a
10971101 -- In the Left state, count is used only for the assert
10981102 let cnt1 = cnt + 1
10991103 case r of
11001104 Partial n s -> do
11011105 assertM(cnt1 - n >= 0)
1102− return $ Continue n (Tuple3' s (cnt1 - n) (Left fs))
1106+ return $ Continue n (Fused3 s (cnt1 - n) (Left fs))
11031107 Continue n s -> do
11041108 assertM(cnt1 - n >= 0)
1105− return $ Continue n (Tuple3' s (cnt1 - n) (Left fs))
1109+ return $ Continue n (Fused3 s (cnt1 - n) (Left fs))
11061110 Done n b -> do
11071111 assertM(cnt1 - n >= 0)
11081112 fstep fs b >>= handleCollect (Partial n) (Done n)
11091113 Error err -> return $ Error err
1110− step (Tuple3' st cnt (Right fs)) a = do
1114+ step (Fused3 st cnt (Right fs)) a = do
11111115 r <- step1 st a
11121116 let cnt1 = cnt + 1
11131117 case r of
11141118 Partial n s -> do
11151119 assertM(cnt1 - n >= 0)
1116− return $ Partial n (Tuple3' s (cnt1 - n) (Right fs))
1120+ return $ Partial n (Fused3 s (cnt1 - n) (Right fs))
11171121 Continue n s -> do
11181122 assertM(cnt1 - n >= 0)
1119− return $ Continue n (Tuple3' s (cnt1 - n) (Right fs))
1123+ return $ Continue n (Fused3 s (cnt1 - n) (Right fs))
11201124 Done n b -> do
11211125 assertM(cnt1 - n >= 0)
11221126 fstep fs b >>= handleCollect (Partial n) (Done n)
11231127 Error _ -> Done cnt1 <$> fextract fs
11241128
1125− extract (Tuple3' s cnt (Left fs)) = do
1129+ extract (Fused3 s cnt (Left fs)) = do
11261130 r <- extract1 s
11271131 case r of
11281132 Error err -> return (Error err)
@@ -1135,8 +1139,8 @@ splitSome (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
11351139 Partial _ _ -> error "splitSome: Partial in extract"
11361140 Continue n s1 -> do
11371141 assertM(n == cnt)
1138− return (Continue n (Tuple3' s1 0 (Left fs)))
1139− extract (Tuple3' s cnt (Right fs)) = do
1142+ return (Continue n (Fused3 s1 0 (Left fs)))
1143+ extract (Fused3 s cnt (Right fs)) = do
11401144 r <- extract1 s
11411145 case r of
11421146 Error _ -> fmap (Done cnt) (fextract fs)
@@ -1149,7 +1153,7 @@ splitSome (Parser step1 initial1 extract1) (Fold fstep finitial fextract) =
11491153 Partial _ _ -> error "splitSome: Partial in extract"
11501154 Continue n s1 -> do
11511155 assertM(n == cnt)
1152− return (Continue n (Tuple3' s1 0 (Right fs)))
1156+ return (Continue n (Fused3 s1 0 (Right fs)))
11531157
11541158-- | A parser that always fails with an error message without consuming
11551159-- any input.