@@ -153,49 +153,51 @@ parse pstep initial extract (Zipper [] backward forward) cont =
154 pRes <- pstep r x
154 pRes <- pstep r x
155 case pRes of
155 case pRes of
157+ assert (n <= length (x:back)) (return ())
158+ let fwd0 = Prelude.take n (x:back)
159+ fwd = Prelude.reverse fwd0
160+ cont (Zipper [] [] fwd) (Done b)
156− D.Partial 0 pst1 -> return $ Partial (parseCont [] (return pst1))
162+ return $ Partial (parseCont [] (return pst1))
157 D.Partial n pst1 -> do
163 D.Partial n pst1 -> do
158 assert (n <= length (x:back)) (return ())
164 assert (n <= length (x:back)) (return ())
159− let src0 = Prelude.take n (x:back)
165+ let fwd0 = Prelude.take n (x:back)
160− src = Prelude.reverse src0
166+ fwd = Prelude.reverse fwd0
161− goBuf [] src (return pst1)
167+ goBuf [] fwd (return pst1)
162 D.Continue 0 pst1 ->
168 D.Continue 0 pst1 ->
163 return $ Continue (parseCont (x:back) (return pst1))
169 return $ Continue (parseCont (x:back) (return pst1))
164 D.Continue n pst1 -> do
170 D.Continue n pst1 -> do
165 assert (n <= length (x:back)) (return ())
171 assert (n <= length (x:back)) (return ())
166− let (src0, buf1) = splitAt n (x:back)
172+ let (fwd0, bwd) = splitAt n (x:back)
167− src = Prelude.reverse src0
173+ fwd = Prelude.reverse fwd0
168− goBuf buf1 src (return pst1)
174+ goBuf bwd fwd (return pst1)
169− D.Done n b -> do
175+ D.Error err ->
170− assert (n <= length (x:back)) (return ())
171− let (src0, buf1) = splitAt n (x:back)
172− src = Prelude.reverse src0
173− cont (Zipper [] buf1 src) (Done b)
174− D.Error err -> cont (Zipper [] (x:back) []) (Error err)
176+ cont (Zipper [] (x:back) []) (Error err)
176 goBuf back [] !acc = return $ Continue (parseCont back acc)
178 goBuf back [] !acc = return $ Continue (parseCont back acc)
177 goBuf back (x:xs) !pst = do
179 goBuf back (x:xs) !pst = do
179 pRes <- pstep r x
181 pRes <- pstep r x
180 case pRes of
182 case pRes of
184+ assert (n <= length (x:back)) (return ())
185+ let fwd0 = Prelude.take n (x:back)
186+ fwd = Prelude.reverse fwd0
187+ cont (Zipper [] [] (fwd ++ xs)) (Done b)
181 D.Partial 0 pst1 ->
188 D.Partial 0 pst1 ->
182 goBuf [] xs (return pst1)
189 goBuf [] xs (return pst1)
183 D.Partial n pst1 -> do
190 D.Partial n pst1 -> do
184 assert (n <= length (x:back)) (return ())
191 assert (n <= length (x:back)) (return ())
185− let src0 = Prelude.take n (x:back)
192+ let fwd0 = Prelude.take n (x:back)
186− src = Prelude.reverse src0
193+ fwd = Prelude.reverse fwd0
187− goBuf [] (src ++ xs) (return pst1)
194+ goBuf [] (fwd ++ xs) (return pst1)
188 D.Continue 0 pst1 -> goBuf (x:back) xs (return pst1)
195 D.Continue 0 pst1 -> goBuf (x:back) xs (return pst1)
189 D.Continue n pst1 -> do
196 D.Continue n pst1 -> do
190 assert (n <= length (x:back)) (return ())
197 assert (n <= length (x:back)) (return ())
191− let (src0, buf1) = splitAt n (x:back)
198+ let (fwd0, bwd) = splitAt n (x:back)
192− src = Prelude.reverse src0 ++ xs
199+ fwd = Prelude.reverse fwd0
193− goBuf buf1 src (return pst1)
200+ goBuf bwd (fwd ++ xs) (return pst1)
195− assert (n <= length (x:back)) (return ())
196− let (src0, buf1) = splitAt n (x:back)
197− src = Prelude.reverse src0 ++ xs
198− cont (Zipper [] buf1 src) (Done b)
199 D.Error err -> cont (Zipper [] (x:back) xs) (Error err)
201 D.Error err -> cont (Zipper [] (x:back) xs) (Error err)
201-- The case when checkpoints exist
203-- The case when checkpoints exist
@@ -223,27 +225,27 @@ parse pstep initial extract (Zipper (cp:cps) backward forward) cont =
223 pRes <- pstep r x
225 pRes <- pstep r x
224 let cnt1 = cnt + 1
226 let cnt1 = cnt + 1
225 case pRes of
227 case pRes of
229+ assert (n <= length (x:back)) (return ())
230+ let fwd0 = Prelude.take n (x:back)
231+ fwd = Prelude.reverse fwd0
232+ assert (cp + cnt1 - n >= 0) (return ())
233+ cont (Zipper (cp + cnt1 - n : cps) [] fwd) (Done b)
226− D.Partial 0 pst1 ->
234+ D.Partial 0 pst1 -> do
227 return $ Partial (parseCont cnt1 [] (return pst1))
235 return $ Partial (parseCont cnt1 [] (return pst1))
228 D.Partial n pst1 -> do
236 D.Partial n pst1 -> do
229 assert (n <= length (x:back)) (return ())
237 assert (n <= length (x:back)) (return ())
230− let src0 = Prelude.take n (x:back)
238+ let fwd0 = Prelude.take n (x:back)
231− src = Prelude.reverse src0
239+ fwd = Prelude.reverse fwd0
232− goBuf (cnt1 - n) [] src (return pst1)
240+ goBuf (cnt1 - n) [] fwd (return pst1)
233 D.Continue 0 pst1 ->
241 D.Continue 0 pst1 ->
234 return $ Continue (parseCont cnt1 (x:back) (return pst1))
242 return $ Continue (parseCont cnt1 (x:back) (return pst1))
235 D.Continue n pst1 -> do
243 D.Continue n pst1 -> do
236 assert (n <= length (x:back)) (return ())
244 assert (n <= length (x:back)) (return ())
237− let (src0, buf1) = splitAt n (x:back)
245+ let (fwd0, bwd) = splitAt n (x:back)
238− src = Prelude.reverse src0
246+ fwd = Prelude.reverse fwd0
239 assert (cnt1 - n >= 0) (return ())
247 assert (cnt1 - n >= 0) (return ())
240− goBuf (cnt1 - n) buf1 src (return pst1)
248+ goBuf (cnt1 - n) bwd fwd (return pst1)
242− assert (n <= length (x:back)) (return ())
243− let (src0, buf1) = splitAt n (x:back)
244− src = Prelude.reverse src0
245− assert (cp + cnt1 - n >= 0) (return ())
246− cont (Zipper (cp + cnt1 - n : cps) buf1 src) (Done b)
247 D.Error err ->
249 D.Error err ->
248 cont (Zipper (cp + cnt1 : cps) (x:back) []) (Error err)
250 cont (Zipper (cp + cnt1 : cps) (x:back) []) (Error err)
@@ -253,26 +255,26 @@ parse pstep initial extract (Zipper (cp:cps) backward forward) cont =
253 pRes <- pstep r x
255 pRes <- pstep r x
254 let cnt1 = cnt + 1
256 let cnt1 = cnt + 1
255 case pRes of
257 case pRes of
259+ assert (n <= length (x:back)) (return ())
260+ let fwd0 = Prelude.take n (x:back)
261+ fwd = Prelude.reverse fwd0
262+ assert (cp + cnt1 - n >= 0) (return ())
263+ cont (Zipper (cp + cnt1 - n : cps) [] (fwd ++ xs)) (Done b)
256 D.Partial 0 pst1 ->
264 D.Partial 0 pst1 ->
257 goBuf cnt1 [] xs (return pst1)
265 goBuf cnt1 [] xs (return pst1)
258 D.Partial n pst1 -> do
266 D.Partial n pst1 -> do
259 assert (n <= length (x:back)) (return ())
267 assert (n <= length (x:back)) (return ())
260− let src0 = Prelude.take n (x:back)
268+ let fwd0 = Prelude.take n (x:back)
261− src = Prelude.reverse src0
269+ fwd = Prelude.reverse fwd0
262− goBuf (cnt1 - n) [] (src ++ xs) (return pst1)
270+ goBuf (cnt1 - n) [] (fwd ++ xs) (return pst1)
263 D.Continue 0 pst1 -> goBuf cnt1 (x:back) xs (return pst1)
271 D.Continue 0 pst1 -> goBuf cnt1 (x:back) xs (return pst1)
264 D.Continue n pst1 -> do
272 D.Continue n pst1 -> do
265 assert (n <= length (x:back)) (return ())
273 assert (n <= length (x:back)) (return ())
266− let (src0, buf1) = splitAt n (x:back)
274+ let (fwd0, bwd) = splitAt n (x:back)
267− src = Prelude.reverse src0 ++ xs
275+ fwd = Prelude.reverse fwd0 ++ xs
268 assert (cnt1 - n >= 0) (return ())
276 assert (cnt1 - n >= 0) (return ())
269− goBuf (cnt1 - n) buf1 src (return pst1)
277+ goBuf (cnt1 - n) bwd fwd (return pst1)
271− assert (n <= length (x:back)) (return ())
272− let (src0, buf1) = splitAt n (x:back)
273− src = Prelude.reverse src0 ++ xs
274− assert (cp + cnt1 - n >= 0) (return ())
275− cont (Zipper (cp + cnt1 - n : cps) buf1 src) (Done b)
276 D.Error err ->
278 D.Error err ->
277 cont (Zipper (cp + cnt1 : cps) (x:back) xs) (Error err)
279 cont (Zipper (cp + cnt1 : cps) (x:back) xs) (Error err)