on master help sign in
Fix two bugs in _parse
ec8ab6fHarendra Kumar
src/Streamly/Internal/Data/Stream/StreamD/Eliminate.hs+19−15
@@ -84,6 +84,7 @@ import Streamly.Internal.Data.Parser (ParseError(..))
84
84
85import qualified Streamly.Internal.Data.Parser as PR
85import qualified Streamly.Internal.Data.Parser as PR
86import qualified Streamly.Internal.Data.Parser.ParserD as PRD
86import qualified Streamly.Internal.Data.Parser.ParserD as PRD
87+import qualified Streamly.Internal.Data.Stream.StreamD.Nesting as Nesting
87
88
88import Prelude hiding
89import Prelude hiding
89 ( all, any, elem, foldr, foldr1, head, last, lookup, mapM, mapM_
90 ( all, any, elem, foldr, foldr1, head, last, lookup, mapM, mapM_
@@ -150,15 +151,18 @@ parse_
150 => PRD.Parser m a b
151 => PRD.Parser m a b
151 -> Stream m a
152 -> Stream m a
152 -> m (b, Stream m a)
153 -> m (b, Stream m a)
153−parse_ (PRD.Parser pstep initial extract) (Stream step state) = do
154+parse_ (PRD.Parser pstep initial extract) stream@(Stream step state) = do
154 res <- initial
155 res <- initial
155 case res of
156 case res of
156 PRD.IPartial s -> go SPEC state (List []) s
157 PRD.IPartial s -> go SPEC state (List []) s
157− PRD.IDone b -> return (b, Stream (\_ _ -> return Stop) ())
158+ PRD.IDone b -> return (b, stream)
158 PRD.IError err -> throwM $ ParseError err
159 PRD.IError err -> throwM $ ParseError err
159
160
160 where
161 where
161
162
163+ -- "buf" contains last few items in the stream that we may have to
164+ -- backtrack to.
165+ --
162 -- XXX currently we are using a dumb list based approach for backtracking
166 -- XXX currently we are using a dumb list based approach for backtracking
163 -- buffer. This can be replaced by a sliding/ring buffer using Data.Array.
167 -- buffer. This can be replaced by a sliding/ring buffer using Data.Array.
164 -- That will allow us more efficient random back and forth movement.
168 -- That will allow us more efficient random back and forth movement.
@@ -181,7 +185,14 @@ parse_ (PRD.Parser pstep initial extract) (Stream step state) = do
181 let (src0, buf1) = splitAt n (x:getList buf)
185 let (src0, buf1) = splitAt n (x:getList buf)
182 src = Prelude.reverse src0
186 src = Prelude.reverse src0
183 gobuf SPEC s (List buf1) (List src) pst1
187 gobuf SPEC s (List buf1) (List src) pst1
184− PR.Done _ b -> return (b, Stream step_rest (Left (s, buf)))
188+ PR.Done 0 b -> return (b, Stream step st)
189+ PR.Done n b -> do
190+ assert (n <= length (x:getList buf)) (return ())
191+ let src0 = Prelude.take n (x:getList buf)
192+ src = Prelude.reverse src0
193+ -- XXX This would make it quadratic. We should probably
194+ -- use StreamK if we have to append many times.
195+ return (b, Nesting.append (fromList src) (Stream step s))
185 PR.Error err -> throwM $ ParseError err
196 PR.Error err -> throwM $ ParseError err
186 Skip s -> go SPEC s buf pst
197 Skip s -> go SPEC s buf pst
187 Stop -> do
198 Stop -> do
@@ -206,20 +217,13 @@ parse_ (PRD.Parser pstep initial extract) (Stream step state) = do
206 let (src0, buf1) = splitAt n (x:getList buf)
217 let (src0, buf1) = splitAt n (x:getList buf)
207 src = Prelude.reverse src0 ++ xs
218 src = Prelude.reverse src0 ++ xs
208 gobuf SPEC s (List buf1) (List src) pst1
219 gobuf SPEC s (List buf1) (List src) pst1
209− PR.Done _ b -> return (b, Stream step_rest (Left (s, buf)))
220+ PR.Done n b -> do
221+ assert (n <= length (x:getList buf)) (return ())
222+ let src0 = Prelude.take n (x:getList buf)
223+ src = Prelude.reverse src0
224+ return (b, Nesting.append (fromList src) (Stream step s))
210 PR.Error err -> throwM $ ParseError err
225 PR.Error err -> throwM $ ParseError err
211
226
212− {-# INLINE_LATE step_rest #-}
213− step_rest _ (Left (st, List [])) = return $ Skip (Right st)
214− step_rest _ (Left (st, List (x:[]))) = return $ Yield x (Right st)
215− step_rest _ (Left (st, List (x:xs))) = return $ Yield x (Left (st, List xs))
216− step_rest gst (Right st) = do
217− r <- step gst st
218− return $ case r of
219− Yield x s -> Yield x (Right s)
220− Skip s -> Skip (Right s)
221− Stop -> Stop
222−
223------------------------------------------------------------------------------
227------------------------------------------------------------------------------
224-- Specialized Folds
228-- Specialized Folds
225------------------------------------------------------------------------------
229------------------------------------------------------------------------------