on master help sign in
Fix deintercalate, sepBy etc.
commit82843a933af10abb2d9ab1b180e3c73d9aea60fe authorHarendra Kumar <harendra@composewell.com> dateMon 27 Feb 2023, 10:05 (4 years ago) parent0db979f
1 file changed+45−60
core/src/Streamly/Internal/Data/Parser/ParserD.hs+45−60
core/src/Streamly/Internal/Data/Parser/ParserD.hs+45−60
@@ -2522,6 +2522,7 @@ lookAhead (Parser step1 initial1 _) = Parser step initial extract
25222522-- all the three parsers. One parser can count the line numbers to provide the
25232523-- line number info.
25242524
2525+{-# ANN type DeintercalateAllState Fuse #-}
25252526data DeintercalateAllState fs sp ss =
25262527 DeintercalateAllInitL !fs
25272528 | DeintercalateAllL !fs !sp
@@ -2570,7 +2571,7 @@ deintercalateAll
25702571 initial = do
25712572 res <- finitial
25722573 case res of
2573− FL.Partial fs -> return $ IPartial $ (DeintercalateAllInitL fs)
2574+ FL.Partial fs -> return $ IPartial $ DeintercalateAllInitL fs
25742575 FL.Done c -> return $ IDone c
25752576
25762577 {-# INLINE processL #-}
@@ -2644,6 +2645,7 @@ deintercalateAll
26442645 extract (DeintercalateAllR _ _) =
26452646 return $ Error "deintercalateAll: input ended at 'Right' value"
26462647
2648+{-# ANN type DeintercalateState Fuse #-}
26472649data DeintercalateState b fs sp ss =
26482650 DeintercalateInitL !fs
26492651 | DeintercalateL !Int !fs !sp
@@ -2651,6 +2653,10 @@ data DeintercalateState b fs sp ss =
26512653 | DeintercalateR !Int !fs !ss
26522654 | DeintercalateRL !Int !b !fs !sp
26532655
2656+-- XXX Add tests that the next character that we take after running a parser is
2657+-- correct. Especially for the parsers that maintain a count. In the stream
2658+-- finished case (extract) as well as not finished case.
2659+
26542660-- | Apply two parsers alternately to an input stream. The input stream is
26552661-- considered an interleaving of two patterns. The two parsers represent the
26562662-- two patterns. Parsing starts at the first parser and stops at the first
@@ -2689,7 +2695,7 @@ deintercalate
26892695 initial = do
26902696 res <- finitial
26912697 case res of
2692− FL.Partial fs -> return $ IPartial $ (DeintercalateInitL fs)
2698+ FL.Partial fs -> return $ IPartial $ DeintercalateInitL fs
26932699 FL.Done c -> return $ IDone c
26942700
26952701 {-# INLINE processL #-}
@@ -2704,8 +2710,8 @@ deintercalate
27042710 let cnt1 = cnt + 1
27052711 r <- stepL sL a
27062712 case r of
2707− Partial n s -> return $ Continue n (DeintercalateL cnt1 fs s)
2708− Continue n s -> return $ Continue n (DeintercalateL cnt1 fs s)
2713+ Partial n s -> return $ Continue n (DeintercalateL (cnt1 - n) fs s)
2714+ Continue n s -> return $ Continue n (DeintercalateL (cnt1 - n) fs s)
27092715 Done n b ->
27102716 processL (fstep fs (Left b)) n DeintercalateInitR
27112717 Error _ -> do
@@ -2725,9 +2731,9 @@ deintercalate
27252731 let cnt1 = cnt + 1
27262732 r <- stepR sR a
27272733 case r of
2728− Partial n s -> return $ Continue n (DeintercalateR cnt1 fs s)
2729− Continue n s -> return $ Continue n (DeintercalateR cnt1 fs s)
2730− Done n b -> processR cnt1 b fs n
2734+ Partial n s -> return $ Continue n (DeintercalateR (cnt1 - n) fs s)
2735+ Continue n s -> return $ Continue n (DeintercalateR (cnt1 - n) fs s)
2736+ Done n b -> processR (cnt1 - n) b fs n
27312737 Error _ -> do
27322738 xs <- fextract fs
27332739 return $ Done cnt1 xs
@@ -2750,8 +2756,8 @@ deintercalate
27502756 let cnt1 = cnt + 1
27512757 r <- stepL sL a
27522758 case r of
2753− Partial n s -> return $ Continue n (DeintercalateRL cnt1 bR fs s)
2754− Continue n s -> return $ Continue n (DeintercalateRL cnt1 bR fs s)
2759+ Partial n s -> return $ Continue n (DeintercalateRL (cnt1 - n) bR fs s)
2760+ Continue n s -> return $ Continue n (DeintercalateRL (cnt1 - n) bR fs s)
27552761 Done n bL -> do
27562762 res <- fstep fs (Right bR)
27572763 case res of
@@ -2779,7 +2785,7 @@ deintercalate
27792785 r <- extractL sL
27802786 case r of
27812787 Done n b -> extractResult n fs (Left b)
2782− Continue n s -> return $ Continue n (DeintercalateL cnt fs s)
2788+ Continue n s -> return $ Continue n (DeintercalateL (cnt - n) fs s)
27832789 Partial _ _ -> error "Partial in extract"
27842790 Error _ -> do
27852791 xs <- fextract fs
@@ -2794,15 +2800,15 @@ deintercalate
27942800 case res of
27952801 FL.Partial fs1 -> extractResult n fs1 (Left bL)
27962802 FL.Done _ -> error "Fold terminated consuming partial input"
2797− Continue n s -> return $ Continue n (DeintercalateRL cnt bR fs s)
2803+ Continue n s -> return $ Continue n (DeintercalateRL (cnt - n) bR fs s)
27982804 Partial _ _ -> error "Partial in extract"
27992805 Error _ -> do
28002806 xs <- fextract fs
28012807 return $ Done cnt xs
28022808
2809+{-# ANN type Deintercalate1State Fuse #-}
28032810data Deintercalate1State b fs sp ss =
28042811 Deintercalate1InitL !Int !fs !sp
2805− | Deintercalate1L !Int !fs !sp
28062812 | Deintercalate1InitR !fs
28072813 | Deintercalate1R !Int !fs !ss
28082814 | Deintercalate1RL !Int !b !fs !sp
@@ -2848,7 +2854,7 @@ deintercalate1
28482854 FL.Partial fs -> do
28492855 pres <- initialL
28502856 case pres of
2851− IPartial s -> return $ IPartial $ (Deintercalate1InitL 0 fs s)
2857+ IPartial s -> return $ IPartial $ Deintercalate1InitL 0 fs s
28522858 IDone _ -> errMsg "left" "succeed"
28532859 IError _ -> errMsg "left" "fail"
28542860 FL.Done c -> return $ IDone c
@@ -2865,25 +2871,12 @@ deintercalate1
28652871 let cnt1 = cnt + 1
28662872 r <- stepL sL a
28672873 case r of
2868− Partial n s -> return $ Continue n (Deintercalate1InitL cnt1 fs s)
2869− Continue n s -> return $ Continue n (Deintercalate1InitL cnt1 fs s)
2874+ Partial n s -> return $ Continue n (Deintercalate1InitL (cnt1 - n) fs s)
2875+ Continue n s -> return $ Continue n (Deintercalate1InitL (cnt1 - n) fs s)
28702876 Done n b ->
28712877 processL (fstep fs (Left b)) n Deintercalate1InitR
28722878 Error err -> return $ Error err
28732879
2874− {-# INLINE runStepL #-}
2875− runStepL cnt fs sL a = do
2876− let cnt1 = cnt + 1
2877− r <- stepL sL a
2878− case r of
2879− Partial n s -> return $ Continue n (Deintercalate1L cnt1 fs s)
2880− Continue n s -> return $ Continue n (Deintercalate1L cnt1 fs s)
2881− Done n b ->
2882− processL (fstep fs (Left b)) n Deintercalate1InitR
2883− Error _ -> do
2884− xs <- fextract fs
2885− return $ Done cnt1 xs
2886−
28872880 {-# INLINE processR #-}
28882881 processR cnt b fs n = do
28892882 res <- initialL
@@ -2897,15 +2890,14 @@ deintercalate1
28972890 let cnt1 = cnt + 1
28982891 r <- stepR sR a
28992892 case r of
2900− Partial n s -> return $ Continue n (Deintercalate1R cnt1 fs s)
2901− Continue n s -> return $ Continue n (Deintercalate1R cnt1 fs s)
2902− Done n b -> processR cnt1 b fs n
2893+ Partial n s -> return $ Continue n (Deintercalate1R (cnt1 - n) fs s)
2894+ Continue n s -> return $ Continue n (Deintercalate1R (cnt1 - n) fs s)
2895+ Done n b -> processR (cnt1 - n) b fs n
29032896 Error _ -> do
29042897 xs <- fextract fs
29052898 return $ Done cnt1 xs
29062899
29072900 step (Deintercalate1InitL cnt fs sL) a = runStepInitL cnt fs sL a
2908− step (Deintercalate1L cnt fs sL) a = runStepL cnt fs sL a
29092901 step (Deintercalate1InitR fs) a = do
29102902 res <- initialR
29112903 case res of
@@ -2917,8 +2909,8 @@ deintercalate1
29172909 let cnt1 = cnt + 1
29182910 r <- stepL sL a
29192911 case r of
2920− Partial n s -> return $ Continue n (Deintercalate1RL cnt1 bR fs s)
2921− Continue n s -> return $ Continue n (Deintercalate1RL cnt1 bR fs s)
2912+ Partial n s -> return $ Continue n (Deintercalate1RL (cnt1 - n) bR fs s)
2913+ Continue n s -> return $ Continue n (Deintercalate1RL (cnt1 - n) bR fs s)
29222914 Done n bL -> do
29232915 res <- fstep fs (Right bR)
29242916 case res of
@@ -2945,18 +2937,9 @@ deintercalate1
29452937 r <- extractL sL
29462938 case r of
29472939 Done n b -> extractResult n fs (Left b)
2948− Continue n s -> return $ Continue n (Deintercalate1InitL cnt fs s)
2940+ Continue n s -> return $ Continue n (Deintercalate1InitL (cnt - n) fs s)
29492941 Partial _ _ -> error "Partial in extract"
29502942 Error err -> return $ Error err
2951− extract (Deintercalate1L cnt fs sL) = do
2952− r <- extractL sL
2953− case r of
2954− Done n b -> extractResult n fs (Left b)
2955− Continue n s -> return $ Continue n (Deintercalate1L cnt fs s)
2956− Partial _ _ -> error "Partial in extract"
2957− Error _ -> do
2958− xs <- fextract fs
2959− return $ Done cnt xs
29602943 extract (Deintercalate1InitR fs) = fmap (Done 0) $ fextract fs
29612944 extract (Deintercalate1R cnt fs _) = fmap (Done cnt) $ fextract fs
29622945 extract (Deintercalate1RL cnt bR fs sL) = do
@@ -2967,12 +2950,13 @@ deintercalate1
29672950 case res of
29682951 FL.Partial fs1 -> extractResult n fs1 (Left bL)
29692952 FL.Done _ -> error "Fold terminated consuming partial input"
2970− Continue n s -> return $ Continue n (Deintercalate1RL cnt bR fs s)
2953+ Continue n s -> return $ Continue n (Deintercalate1RL (cnt - n) bR fs s)
29712954 Partial _ _ -> error "Partial in extract"
29722955 Error _ -> do
29732956 xs <- fextract fs
29742957 return $ Done cnt xs
29752958
2959+{-# ANN type SepByState Fuse #-}
29762960data SepByState fs sp ss =
29772961 SepByInitL !fs
29782962 | SepByL !Int !fs !sp
@@ -3036,8 +3020,8 @@ sepBy
30363020 let cnt1 = cnt + 1
30373021 r <- stepL sL a
30383022 case r of
3039− Partial n s -> return $ Continue n (SepByL cnt1 fs s)
3040− Continue n s -> return $ Continue n (SepByL cnt1 fs s)
3023+ Partial n s -> return $ Continue n (SepByL (cnt1 - n) fs s)
3024+ Continue n s -> return $ Continue n (SepByL (cnt1 - n) fs s)
30413025 Done n b ->
30423026 processL (fstep fs b) n SepByInitR
30433027 Error _ -> do
@@ -3057,9 +3041,9 @@ sepBy
30573041 let cnt1 = cnt + 1
30583042 r <- stepR sR a
30593043 case r of
3060− Partial n s -> return $ Continue n (SepByR cnt1 fs s)
3061− Continue n s -> return $ Continue n (SepByR cnt1 fs s)
3062− Done n _ -> processR cnt1 fs n
3044+ Partial n s -> return $ Continue n (SepByR (cnt1 - n) fs s)
3045+ Continue n s -> return $ Continue n (SepByR (cnt1 - n) fs s)
3046+ Done n _ -> processR (cnt1 - n) fs n
30633047 Error _ -> do
30643048 xs <- fextract fs
30653049 return $ Done cnt1 xs
@@ -3091,7 +3075,7 @@ sepBy
30913075 r <- extractL sL
30923076 case r of
30933077 Done n b -> extractResult n fs b
3094− Continue n s -> return $ Continue n (SepByL cnt fs s)
3078+ Continue n s -> return $ Continue n (SepByL (cnt - n) fs s)
30953079 Partial _ _ -> error "Partial in extract"
30963080 Error _ -> do
30973081 xs <- fextract fs
@@ -3102,6 +3086,7 @@ sepBy
31023086-- XXX This can be implemented using refold, parse one and then continue
31033087-- collecting the rest in that.
31043088
3089+{-# ANN type SepBy1State Fuse #-}
31053090data SepBy1State fs sp ss =
31063091 SepBy1InitL !Int !fs sp
31073092 | SepBy1L !Int !fs !sp
@@ -3172,8 +3157,8 @@ sepBy1
31723157 let cnt1 = cnt + 1
31733158 r <- stepL sL a
31743159 case r of
3175− Partial n s -> return $ Continue n (SepBy1InitL cnt1 fs s)
3176− Continue n s -> return $ Continue n (SepBy1InitL cnt1 fs s)
3160+ Partial n s -> return $ Continue n (SepBy1InitL (cnt1 - n) fs s)
3161+ Continue n s -> return $ Continue n (SepBy1InitL (cnt1 - n) fs s)
31773162 Done n b ->
31783163 processL (fstep fs b) n SepBy1InitR
31793164 Error err -> return $ Error err
@@ -3183,8 +3168,8 @@ sepBy1
31833168 let cnt1 = cnt + 1
31843169 r <- stepL sL a
31853170 case r of
3186− Partial n s -> return $ Continue n (SepBy1L cnt1 fs s)
3187− Continue n s -> return $ Continue n (SepBy1L cnt1 fs s)
3171+ Partial n s -> return $ Continue n (SepBy1L (cnt1 - n) fs s)
3172+ Continue n s -> return $ Continue n (SepBy1L (cnt1 - n) fs s)
31883173 Done n b ->
31893174 processL (fstep fs b) n SepBy1InitR
31903175 Error _ -> do
@@ -3204,9 +3189,9 @@ sepBy1
32043189 let cnt1 = cnt + 1
32053190 r <- stepR sR a
32063191 case r of
3207− Partial n s -> return $ Continue n (SepBy1R cnt1 fs s)
3208− Continue n s -> return $ Continue n (SepBy1R cnt1 fs s)
3209− Done n _ -> processR cnt1 fs n
3192+ Partial n s -> return $ Continue n (SepBy1R (cnt1 - n) fs s)
3193+ Continue n s -> return $ Continue n (SepBy1R (cnt1 - n) fs s)
3194+ Done n _ -> processR (cnt1 - n) fs n
32103195 Error _ -> do
32113196 xs <- fextract fs
32123197 return $ Done cnt1 xs
@@ -3232,14 +3217,14 @@ sepBy1
32323217 r <- extractL sL
32333218 case r of
32343219 Done n b -> extractResult n fs b
3235− Continue n s -> return $ Continue n (SepBy1InitL cnt fs s)
3220+ Continue n s -> return $ Continue n (SepBy1InitL (cnt - n) fs s)
32363221 Partial _ _ -> error "Partial in extract"
32373222 Error err -> return $ Error err
32383223 extract (SepBy1L cnt fs sL) = do
32393224 r <- extractL sL
32403225 case r of
32413226 Done n b -> extractResult n fs b
3242− Continue n s -> return $ Continue n (SepBy1L cnt fs s)
3227+ Continue n s -> return $ Continue n (SepBy1L (cnt - n) fs s)
32433228 Partial _ _ -> error "Partial in extract"
32443229 Error _ -> do
32453230 xs <- fextract fs