@@ -1147,14 +1147,15 @@ data ParseChunksState x inpBuf st pst =
11471147 | ParseChunksExtract inpBuf inpBuf !pst
11481148 | ParseChunksYield x (ParseChunksState x inpBuf st pst)
11491149
1150+-- XXX return the remaining stream as part of the error.
11501151-- XXX This is in fact parseMany1 (a la foldMany1). Do we need a parseMany as
11511152-- well?
11521153{-# INLINE_NORMAL parseMany #-}
11531154parseMany
1154− :: MonadThrow m
1155+ :: Monad m
11551156 => PRD.Parser a m b
11561157 -> Stream m a
1157− -> Stream m b
1158+ -> Stream m (Either ParseError b)
11581159parseMany (PRD.Parser pstep initial extract) (Stream step state) =
11591160 Stream stepOuter (ParseChunksInit [] state)
11601161
@@ -1173,8 +1174,13 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
11731174 return $ Skip $ ParseChunksBuf [x] s [] ps
11741175 PRD.IDone pb ->
11751176 let next = ParseChunksInit [x] s
1176− in return $ Skip $ ParseChunksYield pb next
1177− PRD.IError err -> throwM $ ParseError err
1177+ in return $ Skip $ ParseChunksYield (Right pb) next
1178+ PRD.IError err ->
1179+ return
1180+ $ Skip
1181+ $ ParseChunksYield
1182+ (Left (ParseError err))
1183+ (ParseChunksInitLeftOver [])
11781184 Skip s -> return $ Skip $ ParseChunksInit [] s
11791185 Stop -> return Stop
11801186
@@ -1186,8 +1192,13 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
11861192 return $ Skip $ ParseChunksBuf src st [] ps
11871193 PRD.IDone pb ->
11881194 let next = ParseChunksInit src st
1189− in return $ Skip $ ParseChunksYield pb next
1190− PRD.IError err -> throwM $ ParseError err
1195+ in return $ Skip $ ParseChunksYield (Right pb) next
1196+ PRD.IError err ->
1197+ return
1198+ $ Skip
1199+ $ ParseChunksYield
1200+ (Left (ParseError err))
1201+ (ParseChunksInitLeftOver [])
11911202
11921203 -- This is simplified ParseChunksInit
11931204 stepOuter _ (ParseChunksInitBuf src) = do
@@ -1197,8 +1208,13 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
11971208 return $ Skip $ ParseChunksExtract src [] ps
11981209 PRD.IDone pb ->
11991210 let next = ParseChunksInitBuf src
1200− in return $ Skip $ ParseChunksYield pb next
1201− PRD.IError err -> throwM $ ParseError err
1211+ in return $ Skip $ ParseChunksYield (Right pb) next
1212+ PRD.IError err ->
1213+ return
1214+ $ Skip
1215+ $ ParseChunksYield
1216+ (Left (ParseError err))
1217+ (ParseChunksInitLeftOver [])
12021218
12031219 -- XXX we just discard any leftover input at the end
12041220 stepOuter _ (ParseChunksInitLeftOver _) = return Stop
@@ -1226,13 +1242,18 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
12261242 return $ Skip $ ParseChunksBuf src s buf1 pst1
12271243 PR.Done 0 b -> do
12281244 return $ Skip $
1229− ParseChunksYield b (ParseChunksInit [] s)
1245+ ParseChunksYield (Right b) (ParseChunksInit [] s)
12301246 PR.Done n b -> do
12311247 assert (n <= length (x:buf)) (return ())
12321248 let src = Prelude.reverse (Prelude.take n (x:buf))
12331249 return $ Skip $
1234− ParseChunksYield b (ParseChunksInit src s)
1235− PR.Error err -> throwM $ ParseError err
1250+ ParseChunksYield (Right b) (ParseChunksInit src s)
1251+ PR.Error err ->
1252+ return
1253+ $ Skip
1254+ $ ParseChunksYield
1255+ (Left (ParseError err))
1256+ (ParseChunksInitLeftOver [])
12361257 Skip s -> return $ Skip $ ParseChunksStream s buf pst
12371258 Stop -> return $ Skip $ ParseChunksStop buf pst
12381259
@@ -1259,12 +1280,20 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
12591280 src = Prelude.reverse src0 ++ xs
12601281 return $ Skip $ ParseChunksBuf src s buf1 pst1
12611282 PR.Done 0 b ->
1262− return $ Skip $ ParseChunksYield b (ParseChunksInit xs s)
1283+ return
1284+ $ Skip
1285+ $ ParseChunksYield (Right b) (ParseChunksInit xs s)
12631286 PR.Done n b -> do
12641287 assert (n <= length (x:buf)) (return ())
12651288 let src = Prelude.reverse (Prelude.take n (x:buf)) ++ xs
1266− return $ Skip $ ParseChunksYield b (ParseChunksInit src s)
1267− PR.Error err -> throwM $ ParseError err
1289+ return $ Skip
1290+ $ ParseChunksYield (Right b) (ParseChunksInit src s)
1291+ PR.Error err ->
1292+ return
1293+ $ Skip
1294+ $ ParseChunksYield
1295+ (Left (ParseError err))
1296+ (ParseChunksInitLeftOver [])
12681297
12691298 -- This is simplified ParseChunksBuf
12701299 stepOuter _ (ParseChunksExtract [] buf pst) =
@@ -1288,12 +1317,21 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
12881317 src = Prelude.reverse src0 ++ xs
12891318 return $ Skip $ ParseChunksExtract src buf1 pst1
12901319 PR.Done 0 b ->
1291− return $ Skip $ ParseChunksYield b (ParseChunksInitBuf xs)
1320+ return
1321+ $ Skip
1322+ $ ParseChunksYield (Right b) (ParseChunksInitBuf xs)
12921323 PR.Done n b -> do
12931324 assert (n <= length (x:buf)) (return ())
12941325 let src = Prelude.reverse (Prelude.take n (x:buf)) ++ xs
1295− return $ Skip $ ParseChunksYield b (ParseChunksInitBuf src)
1296− PR.Error err -> throwM $ ParseError err
1326+ return
1327+ $ Skip
1328+ $ ParseChunksYield (Right b) (ParseChunksInitBuf src)
1329+ PR.Error err ->
1330+ return
1331+ $ Skip
1332+ $ ParseChunksYield
1333+ (Left (ParseError err))
1334+ (ParseChunksInitLeftOver [])
12971335
12981336 -- This is simplified ParseChunksExtract
12991337 stepOuter _ (ParseChunksStop buf pst) = do
@@ -1309,13 +1347,18 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
13091347 return $ Skip $ ParseChunksExtract src buf1 pst1
13101348 PR.Done 0 b -> do
13111349 return $ Skip $
1312− ParseChunksYield b (ParseChunksInitLeftOver [])
1350+ ParseChunksYield (Right b) (ParseChunksInitLeftOver [])
13131351 PR.Done n b -> do
13141352 assert (n <= length buf) (return ())
13151353 let src = Prelude.reverse (Prelude.take n buf)
13161354 return $ Skip $
1317− ParseChunksYield b (ParseChunksInitBuf src)
1318− PR.Error err -> throwM $ ParseError err
1355+ ParseChunksYield (Right b) (ParseChunksInitBuf src)
1356+ PR.Error err ->
1357+ return
1358+ $ Skip
1359+ $ ParseChunksYield
1360+ (Left (ParseError err))
1361+ (ParseChunksInitLeftOver [])
13191362
13201363 stepOuter _ (ParseChunksYield a next) = return $ Yield a next
13211364