@@ -907,9 +907,9 @@ parseBreakChunksK ::
907907parseBreakChunksK (Parser pstep initial extract) stream = do
908908 res <- initial
909909 case res of
910- IPartial s -> go s stream []
910+ IPartial s -> go s stream [] 0
911911 IDone b -> return (Right b, stream)
912- IError err -> return (Left (ParseError err), stream)
912+ IError err -> return (Left (ParseError 0 err), stream)
913913
914914 where
915915
@@ -919,37 +919,37 @@ parseBreakChunksK (Parser pstep initial extract) stream = do
919919 -- XXX currently we are using a dumb list based approach for backtracking
920920 -- buffer. This can be replaced by a sliding/ring buffer using Data.Array.
921921 -- That will allow us more efficient random back and forth movement.
922- go ! pst st backBuf = do
923- let stop = goStop pst backBuf -- (, K.nil) <$> extract pst
922+ go ! pst st backBuf i = do
923+ let stop = goStop pst backBuf i -- (, K.nil) <$> extract pst
924924 single a = yieldk a StreamK. nil
925- yieldk arr r = goArray pst backBuf r arr
925+ yieldk arr r = goArray pst backBuf r arr i
926926 in StreamK. foldStream defState yieldk single stop st
927927
928928 -- Use strictness on "cur" to keep it unboxed
929- goArray ! pst backBuf st (Array _ cur end) | cur == end = go pst st backBuf
930- goArray ! pst backBuf st (Array contents cur end) = do
929+ goArray ! pst backBuf st (Array _ cur end) i | cur == end = go pst st backBuf i
930+ goArray ! pst backBuf st (Array contents cur end) i = do
931931 x <- liftIO $ peekAt cur contents
932932 pRes <- pstep pst x
933933 let next = INDEX_NEXT (cur,a)
934934 case pRes of
935935 Parser. Partial 0 s ->
936- goArray s [] st (Array contents next end)
936+ goArray s [] st (Array contents next end) (i + 1 )
937937 Parser. Partial n s -> do
938938 assert (n <= Prelude. length (x: backBuf)) (return () )
939939 let src0 = Prelude. take n (x: backBuf)
940940 arr0 = fromListN n (Prelude. reverse src0)
941941 arr1 = Array contents next end
942942 src = arr0 <> arr1
943- goArray s [] st src
943+ goArray s [] st src (i + 1 - n)
944944 Parser. Continue 0 s ->
945- goArray s (x: backBuf) st (Array contents next end)
945+ goArray s (x: backBuf) st (Array contents next end) (i + 1 )
946946 Parser. Continue n s -> do
947947 assert (n <= Prelude. length (x: backBuf)) (return () )
948948 let (src0, buf1) = Prelude. splitAt n (x: backBuf)
949949 arr0 = fromListN n (Prelude. reverse src0)
950950 arr1 = Array contents next end
951951 src = arr0 <> arr1
952- goArray s buf1 st src
952+ goArray s buf1 st src (i + 1 - n)
953953 Parser. Done 0 b -> do
954954 let arr = Array contents next end
955955 return (Right b, StreamK. cons arr st)
@@ -967,34 +967,34 @@ parseBreakChunksK (Parser pstep initial extract) stream = do
967967 arr0 = fromListN n (Prelude. reverse backBuf)
968968 arr1 = Array contents cur end
969969 str = StreamK. cons arr0 (StreamK. cons arr1 st)
970- return (Left (ParseError err), str)
970+ return (Left (ParseError (i + 1 ) err), str)
971971
972972 -- This is a simplified goArray
973- goExtract ! pst backBuf (Array _ cur end)
974- | cur == end = goStop pst backBuf
975- goExtract ! pst backBuf (Array contents cur end) = do
973+ goExtract ! pst backBuf (Array _ cur end) i
974+ | cur == end = goStop pst backBuf i
975+ goExtract ! pst backBuf (Array contents cur end) i = do
976976 x <- liftIO $ peekAt cur contents
977977 pRes <- pstep pst x
978978 let next = INDEX_NEXT (cur,a)
979979 case pRes of
980980 Parser. Partial 0 s ->
981- goExtract s [] (Array contents next end)
981+ goExtract s [] (Array contents next end) (i + 1 )
982982 Parser. Partial n s -> do
983983 assert (n <= Prelude. length (x: backBuf)) (return () )
984984 let src0 = Prelude. take n (x: backBuf)
985985 arr0 = fromListN n (Prelude. reverse src0)
986986 arr1 = Array contents next end
987987 src = arr0 <> arr1
988- goExtract s [] src
988+ goExtract s [] src (i + 1 - n)
989989 Parser. Continue 0 s ->
990- goExtract s backBuf (Array contents next end)
990+ goExtract s backBuf (Array contents next end) (i + 1 )
991991 Parser. Continue n s -> do
992992 assert (n <= Prelude. length (x: backBuf)) (return () )
993993 let (src0, buf1) = Prelude. splitAt n (x: backBuf)
994994 arr0 = fromListN n (Prelude. reverse src0)
995995 arr1 = Array contents next end
996996 src = arr0 <> arr1
997- goExtract s buf1 src
997+ goExtract s buf1 src (i + 1 - n)
998998 Parser. Done 0 b -> do
999999 let arr = Array contents next end
10001000 return (Right b, StreamK. fromPure arr)
@@ -1012,21 +1012,21 @@ parseBreakChunksK (Parser pstep initial extract) stream = do
10121012 arr0 = fromListN n (Prelude. reverse backBuf)
10131013 arr1 = Array contents cur end
10141014 str = StreamK. cons arr0 (StreamK. fromPure arr1)
1015- return (Left (ParseError err), str)
1015+ return (Left (ParseError (i + 1 ) err), str)
10161016
10171017 -- This is a simplified goExtract
10181018 {-# INLINE goStop #-}
1019- goStop ! pst backBuf = do
1019+ goStop ! pst backBuf i = do
10201020 pRes <- extract pst
10211021 case pRes of
10221022 Parser. Partial _ _ -> error " Bug: parseBreak: Partial in extract"
10231023 Parser. Continue 0 s ->
1024- goStop s backBuf
1024+ goStop s backBuf i
10251025 Parser. Continue n s -> do
10261026 assert (n <= Prelude. length backBuf) (return () )
10271027 let (src0, buf1) = Prelude. splitAt n backBuf
10281028 arr = fromListN n (Prelude. reverse src0)
1029- goExtract s buf1 arr
1029+ goExtract s buf1 arr (i - n)
10301030 Parser. Done 0 b ->
10311031 return (Right b, StreamK. nil)
10321032 Parser. Done n b -> do
@@ -1039,4 +1039,4 @@ parseBreakChunksK (Parser pstep initial extract) stream = do
10391039 Parser. Error err -> do
10401040 let n = Prelude. length backBuf
10411041 arr0 = fromListN n (Prelude. reverse backBuf)
1042- return (Left (ParseError err), StreamK. fromPure arr0)
1042+ return (Left (ParseError i err), StreamK. fromPure arr0)
0 commit comments