on master help sign in
Simplify fold and foldBreak implementation
commitd68e0e6e9c23e0d342325dcd282815456de63677 authorHarendra Kumar <harendra@composewell.com> dateWed 18 May 2022, 23:30 (4 years ago) parent1411c81
1 file changed+9−7
src/Streamly/Internal/Data/Stream/IsStream/Common.hs+9−7
src/Streamly/Internal/Data/Stream/IsStream/Common.hs+9−7
@@ -75,7 +75,7 @@ import Streamly.Internal.Data.Fold.Type (Fold (..))
7575import Streamly.Internal.Data.Stream.IsStream.Combinators (maxYields)
7676import Streamly.Internal.Data.Stream.IsStream.Type
7777 (IsStream(..), fromStreamD, toStreamD, fromStreamS, toStreamS)
78−import Streamly.Internal.Data.Stream.Serial (SerialT)
78+import Streamly.Internal.Data.Stream.Serial (SerialT(..))
7979import Streamly.Internal.Data.Time.Units (AbsTime, RelTime64, addToAbsTime64)
8080
8181import qualified Streamly.Internal.Data.Array.Foreign.Type as A
@@ -307,15 +307,17 @@ foldContinue f s = D.foldContinue f $ IsStream.toStreamD s
307307-- @since 0.7.0
308308{-# INLINE fold #-}
309309fold :: Monad m => Fold m a b -> SerialT m a -> m b
310−fold fl strm = do
311− (b, _) <- foldBreak fl strm
312− return $! b
310+fold fl (SerialT strm) = D.fold fl $ D.fromStreamK strm
313311
312+-- XXX This shows quadratic performance when used recursively perhaps because
313+-- of StreamK to StreamD conversions not getting eliminated sue to recursion.
314314{-# INLINE foldBreak #-}
315315foldBreak :: Monad m => Fold m a b -> SerialT m a -> m (b, SerialT m a)
316−foldBreak fl strm = do
317− (b, str) <- D.foldBreak fl $ IsStream.toStreamD strm
318− return $! (b, IsStream.fromStreamD str)
316+foldBreak fl (SerialT strm) = fmap f $ D.foldBreak fl $ D.fromStreamK strm
317+
318+ where
319+
320+ f (b, str) = (b, SerialT (D.toStreamK str))
319321
320322------------------------------------------------------------------------------
321323-- Transformation