@@ -17,6 +17,7 @@ module Streamly.Internal.Data.Stream.StreamD.Eliminate
1717
1818 -- -- * Running a 'Parser'
1919 , parse
20+ , parse_
2021
2122 -- * Stream Deconstruction
2223 , uncons
@@ -133,12 +134,27 @@ newtype List a = List {getList :: [a]}
133134
134135-- | Run a 'Parse' over a stream.
135136{-# INLINE_NORMAL parse #-}
136−parse :: MonadThrow m => PRD.Parser m a b -> Stream m a -> m b
137−parse (PRD.Parser pstep initial extract) (Stream step state) = do
137+parse
138+ :: MonadThrow m
139+ => PRD.Parser m a b
140+ -> Stream m a
141+ -> m b
142+parse parser strm = do
143+ (b, _) <- parse_ parser strm
144+ return b
145+
146+-- | Run a 'Parse' over a stream and return rest of the Stream.
147+{-# INLINE_NORMAL parse_ #-}
148+parse_
149+ :: MonadThrow m
150+ => PRD.Parser m a b
151+ -> Stream m a
152+ -> m (b, Stream m a)
153+parse_ (PRD.Parser pstep initial extract) (Stream step state) = do
138154 res <- initial
139155 case res of
140156 PRD.IPartial s -> go SPEC state (List []) s
141− PRD.IDone b -> return b
157+ PRD.IDone b -> return (b, Stream (\_ _ -> return Stop) ())
142158 PRD.IError err -> throwM $ ParseError err
143159
144160 where
@@ -165,10 +181,12 @@ parse (PRD.Parser pstep initial extract) (Stream step state) = do
165181 let (src0, buf1) = splitAt n (x:getList buf)
166182 src = Prelude.reverse src0
167183 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)))
169185 PR.Error err -> throwM $ ParseError err
170186 Skip s -> go SPEC s buf pst
171− Stop -> extract pst
187+ Stop -> do
188+ b <- extract pst
189+ return (b, let List buffer = buf in fromList buffer)
172190
173191 gobuf !_ s buf (List []) !pst = go SPEC s buf pst
174192 gobuf !_ s buf (List (x:xs)) !pst = do
@@ -188,9 +206,20 @@ parse (PRD.Parser pstep initial extract) (Stream step state) = do
188206 let (src0, buf1) = splitAt n (x:getList buf)
189207 src = Prelude.reverse src0 ++ xs
190208 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)))
192210 PR.Error err -> throwM $ ParseError err
193211
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+
194223------------------------------------------------------------------------------
195224-- Specialized Folds
196225------------------------------------------------------------------------------