@@ -17,6 +17,7 @@ module Streamly.Internal.Data.Stream.StreamD.Eliminate
18 -- -- * Running a 'Parser'
18 -- -- * Running a 'Parser'
21 -- * Stream Deconstruction
22 -- * Stream Deconstruction
@@ -133,12 +134,27 @@ newtype List a = List {getList :: [a]}
134-- | Run a 'Parse' over a stream.
135-- | Run a 'Parse' over a stream.
135{-# INLINE_NORMAL parse #-}
136{-# INLINE_NORMAL parse #-}
136−parse :: MonadThrow m => PRD.Parser m a b -> Stream m a -> m b
139+ => PRD.Parser m a b
142+parse parser strm = do
143+ (b, _) <- parse_ parser strm
146+-- | Run a 'Parse' over a stream and return rest of the Stream.
147+{-# INLINE_NORMAL parse_ #-}
152+ -> m (b, Stream m a)
137−parse (PRD.Parser pstep initial extract) (Stream step state) = do
153+parse_ (PRD.Parser pstep initial extract) (Stream step state) = do
138 res <- initial
154 res <- initial
139 case res of
155 case res of
140 PRD.IPartial s -> go SPEC state (List []) s
156 PRD.IPartial s -> go SPEC state (List []) s
141− PRD.IDone b -> return b
157+ PRD.IDone b -> return (b, Stream (\_ _ -> return Stop) ())
142 PRD.IError err -> throwM $ ParseError err
158 PRD.IError err -> throwM $ ParseError err
@@ -165,10 +181,12 @@ parse (PRD.Parser pstep initial extract) (Stream step state) = do
165 let (src0, buf1) = splitAt n (x:getList buf)
181 let (src0, buf1) = splitAt n (x:getList buf)
166 src = Prelude.reverse src0
182 src = Prelude.reverse src0
167 gobuf SPEC s (List buf1) (List src) pst1
183 gobuf SPEC s (List buf1) (List src) pst1
168− PR.Done _ b -> return b
184+ PR.Done _ b -> return (b, Stream step_rest (Left (s, buf)))
169 PR.Error err -> throwM $ ParseError err
185 PR.Error err -> throwM $ ParseError err
170 Skip s -> go SPEC s buf pst
186 Skip s -> go SPEC s buf pst
171− Stop -> extract pst
188+ b <- extract pst
189+ return (b, let List buffer = buf in fromList buffer)
173 gobuf !_ s buf (List []) !pst = go SPEC s buf pst
191 gobuf !_ s buf (List []) !pst = go SPEC s buf pst
174 gobuf !_ s buf (List (x:xs)) !pst = do
192 gobuf !_ s buf (List (x:xs)) !pst = do
@@ -188,9 +206,20 @@ parse (PRD.Parser pstep initial extract) (Stream step state) = do
188 let (src0, buf1) = splitAt n (x:getList buf)
206 let (src0, buf1) = splitAt n (x:getList buf)
189 src = Prelude.reverse src0 ++ xs
207 src = Prelude.reverse src0 ++ xs
190 gobuf SPEC s (List buf1) (List src) pst1
208 gobuf SPEC s (List buf1) (List src) pst1
191− PR.Done _ b -> return b
209+ PR.Done _ b -> return (b, Stream step_rest (Left (s, buf)))
192 PR.Error err -> throwM $ ParseError err
210 PR.Error err -> throwM $ ParseError err
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
219+ Yield x s -> Yield x (Right s)
220+ Skip s -> Skip (Right s)
194------------------------------------------------------------------------------
223------------------------------------------------------------------------------
195-- Specialized Folds
224-- Specialized Folds
196------------------------------------------------------------------------------
225------------------------------------------------------------------------------