@@ -153,49 +153,51 @@ parse pstep initial extract (Zipper [] backward forward) cont =
153153 r <- pst
154154 pRes <- pstep r x
155155 case pRes of
156− D.Partial 0 pst1 -> return $ Partial (parseCont [] (return pst1))
156+ D.Done n b -> do
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)
161+ D.Partial 0 pst1 ->
162+ return $ Partial (parseCont [] (return pst1))
157163 D.Partial n pst1 -> do
158164 assert (n <= length (x:back)) (return ())
159− let src0 = Prelude.take n (x:back)
160− src = Prelude.reverse src0
161− goBuf [] src (return pst1)
165+ let fwd0 = Prelude.take n (x:back)
166+ fwd = Prelude.reverse fwd0
167+ goBuf [] fwd (return pst1)
162168 D.Continue 0 pst1 ->
163169 return $ Continue (parseCont (x:back) (return pst1))
164170 D.Continue n pst1 -> do
165171 assert (n <= length (x:back)) (return ())
166− let (src0, buf1) = splitAt n (x:back)
167− src = Prelude.reverse src0
168− goBuf buf1 src (return pst1)
169− D.Done n b -> do
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)
172+ let (fwd0, bwd) = splitAt n (x:back)
173+ fwd = Prelude.reverse fwd0
174+ goBuf bwd fwd (return pst1)
175+ D.Error err ->
176+ cont (Zipper [] (x:back) []) (Error err)
175177
176178 goBuf back [] !acc = return $ Continue (parseCont back acc)
177179 goBuf back (x:xs) !pst = do
178180 r <- pst
179181 pRes <- pstep r x
180182 case pRes of
183+ D.Done n b -> do
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)
181188 D.Partial 0 pst1 ->
182189 goBuf [] xs (return pst1)
183190 D.Partial n pst1 -> do
184191 assert (n <= length (x:back)) (return ())
185− let src0 = Prelude.take n (x:back)
186− src = Prelude.reverse src0
187− goBuf [] (src ++ xs) (return pst1)
192+ let fwd0 = Prelude.take n (x:back)
193+ fwd = Prelude.reverse fwd0
194+ goBuf [] (fwd ++ xs) (return pst1)
188195 D.Continue 0 pst1 -> goBuf (x:back) xs (return pst1)
189196 D.Continue n pst1 -> do
190197 assert (n <= length (x:back)) (return ())
191− let (src0, buf1) = splitAt n (x:back)
192− src = Prelude.reverse src0 ++ xs
193− goBuf buf1 src (return pst1)
194− D.Done n b -> do
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)
198+ let (fwd0, bwd) = splitAt n (x:back)
199+ fwd = Prelude.reverse fwd0
200+ goBuf bwd (fwd ++ xs) (return pst1)
199201 D.Error err -> cont (Zipper [] (x:back) xs) (Error err)
200202
201203-- The case when checkpoints exist
@@ -223,27 +225,27 @@ parse pstep initial extract (Zipper (cp:cps) backward forward) cont =
223225 pRes <- pstep r x
224226 let cnt1 = cnt + 1
225227 case pRes of
226− D.Partial 0 pst1 ->
228+ D.Done n b -> do
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)
234+ D.Partial 0 pst1 -> do
227235 return $ Partial (parseCont cnt1 [] (return pst1))
228236 D.Partial n pst1 -> do
229237 assert (n <= length (x:back)) (return ())
230− let src0 = Prelude.take n (x:back)
231− src = Prelude.reverse src0
232− goBuf (cnt1 - n) [] src (return pst1)
238+ let fwd0 = Prelude.take n (x:back)
239+ fwd = Prelude.reverse fwd0
240+ goBuf (cnt1 - n) [] fwd (return pst1)
233241 D.Continue 0 pst1 ->
234242 return $ Continue (parseCont cnt1 (x:back) (return pst1))
235243 D.Continue n pst1 -> do
236244 assert (n <= length (x:back)) (return ())
237− let (src0, buf1) = splitAt n (x:back)
238− src = Prelude.reverse src0
245+ let (fwd0, bwd) = splitAt n (x:back)
246+ fwd = Prelude.reverse fwd0
239247 assert (cnt1 - n >= 0) (return ())
240− goBuf (cnt1 - n) buf1 src (return pst1)
241− D.Done n b -> do
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)
248+ goBuf (cnt1 - n) bwd fwd (return pst1)
247249 D.Error err ->
248250 cont (Zipper (cp + cnt1 : cps) (x:back) []) (Error err)
249251
@@ -253,26 +255,26 @@ parse pstep initial extract (Zipper (cp:cps) backward forward) cont =
253255 pRes <- pstep r x
254256 let cnt1 = cnt + 1
255257 case pRes of
258+ D.Done n b -> do
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)
256264 D.Partial 0 pst1 ->
257265 goBuf cnt1 [] xs (return pst1)
258266 D.Partial n pst1 -> do
259267 assert (n <= length (x:back)) (return ())
260− let src0 = Prelude.take n (x:back)
261− src = Prelude.reverse src0
262− goBuf (cnt1 - n) [] (src ++ xs) (return pst1)
268+ let fwd0 = Prelude.take n (x:back)
269+ fwd = Prelude.reverse fwd0
270+ goBuf (cnt1 - n) [] (fwd ++ xs) (return pst1)
263271 D.Continue 0 pst1 -> goBuf cnt1 (x:back) xs (return pst1)
264272 D.Continue n pst1 -> do
265273 assert (n <= length (x:back)) (return ())
266− let (src0, buf1) = splitAt n (x:back)
267− src = Prelude.reverse src0 ++ xs
274+ let (fwd0, bwd) = splitAt n (x:back)
275+ fwd = Prelude.reverse fwd0 ++ xs
268276 assert (cnt1 - n >= 0) (return ())
269− goBuf (cnt1 - n) buf1 src (return pst1)
270− D.Done n b -> do
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)
277+ goBuf (cnt1 - n) bwd fwd (return pst1)
276278 D.Error err ->
277279 cont (Zipper (cp + cnt1 : cps) (x:back) xs) (Error err)
278280