@@ -42,6 +42,7 @@ module Streamly.Internal.Data.Stream.Serial
4242 -- * Transformation
4343 , map
4444 , mapM
45+ , foldFilter
4546
4647 -- * Deprecated
4748 , StreamT
@@ -72,12 +73,14 @@ import Text.Read
7273 ( Lexeme(Ident), lexP, parens, prec, readPrec, readListPrec
7374 , readListPrecDefault)
7475import Streamly.Internal.BaseCompat ((#.), errorWithoutStackTrace, oneShot)
76+import Streamly.Internal.Data.Fold.Type (Fold)
7577import Streamly.Internal.Data.Maybe.Strict (Maybe'(..), toMaybe)
7678import Streamly.Internal.Data.Stream.StreamK.Type
7779 (Stream, mkStream, foldStream)
7880
7981import qualified Streamly.Internal.Data.Stream.Common as P
8082import qualified Streamly.Internal.Data.Stream.StreamD.Generate as D
83+import qualified Streamly.Internal.Data.Stream.StreamD.Transform as D
8184import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
8285import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
8386
@@ -259,6 +262,23 @@ NFDATA1_INSTANCE(SerialT)
259262FOLDABLE_INSTANCE(SerialT)
260263TRAVERSABLE_INSTANCE(SerialT)
261264
265+{-# INLINE toStreamD #-}
266+toStreamD :: Applicative m => SerialT m a -> D.Stream m a
267+toStreamD (SerialT m) = D.fromStreamK m
268+
269+{-# INLINE fromStreamD #-}
270+fromStreamD :: Monad m => D.Stream m a -> SerialT m a
271+fromStreamD m = SerialT $ D.toStreamK m
272+
273+-- | Use a filtering fold on a stream.
274+--
275+-- > Stream.sum $ Stream.foldFilter (Fold.satisfy (> 5)) $ Stream.fromList [1..10]
276+-- 40
277+--
278+{-# INLINE foldFilter #-}
279+foldFilter :: Monad m => Fold m a (Maybe b) -> SerialT m a -> SerialT m b
280+foldFilter p = fromStreamD . D.foldFilter p . toStreamD
281+
262282------------------------------------------------------------------------------
263283-- WSerialT
264284------------------------------------------------------------------------------