@@ -35,6 +35,8 @@ module Streamly.Internal.Data.Stream.Zip
38import Control.Applicative (liftA2)
40import Control.Applicative (liftA2)
39import Control.DeepSeq (NFData(..))
41import Control.DeepSeq (NFData(..))
40#if MIN_VERSION_deepseq(1,4,3)
42#if MIN_VERSION_deepseq(1,4,3)
@@ -56,18 +58,13 @@ import Streamly.Internal.Data.Stream.StreamK (IsStream(..), Stream)
56import Streamly.Internal.Data.Maybe.Strict (Maybe'(..), toMaybe)
58import Streamly.Internal.Data.Maybe.Strict (Maybe'(..), toMaybe)
57import Streamly.Internal.Data.SVar (MonadAsync)
59import Streamly.Internal.Data.SVar (MonadAsync)
61+import Streamly.Internal.Data.Stream.Serial (SerialT)
59import qualified Streamly.Internal.Data.Stream.Parallel as Par
63import qualified Streamly.Internal.Data.Stream.Parallel as Par
60import qualified Streamly.Internal.Data.Stream.Prelude as P
64import qualified Streamly.Internal.Data.Stream.Prelude as P
61− (cmpBy, eqBy, foldl', foldr, fromList, toList, fromStreamS, toStreamS)
65+ (cmpBy, eqBy, foldl', foldr, fromList, toList)
62−import qualified Streamly.Internal.Data.Stream.StreamK as K (repeat)
66+import qualified Streamly.Internal.Data.Stream.StreamK as K
63−import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
64−import qualified Streamly.Internal.Data.Stream.StreamD as D (zipWithM)
67+import qualified Streamly.Internal.Data.Stream.StreamD as D
65−import qualified Streamly.Internal.Data.Stream.StreamD.Type as D
66−#ifdef USE_STREAMK_ONLY
67−import qualified Streamly.Internal.Data.Stream.StreamK as S (zipWith, zipWithM)
69−import qualified Streamly.Internal.Data.Stream.StreamD as S (zipWith, zipWithM)
72import Prelude hiding (map, repeat, zipWith, errorWithoutStackTrace)
69import Prelude hiding (map, repeat, zipWith, errorWithoutStackTrace)
@@ -85,11 +82,21 @@ import Prelude hiding (map, repeat, zipWith, errorWithoutStackTrace)
85-- | Like 'zipWith' but using a monadic zipping function.
82-- | Like 'zipWith' but using a monadic zipping function.
87-- @since 0.4.0
84-- @since 0.4.0
88−{-# INLINABLE zipWithM #-}
85+{-# INLINE_EARLY zipWithM #-}
87+ (IsStream t, MonadAsync m) => (a -> b -> m c) -> t m a -> t m b -> t m c
89+ K.fromStream $ K.zipWithM f (K.toStream m1) (K.toStream m2)
91+{-# RULES "zipWithM serial" zipWithM = zipWithMSerial #-}
92+{-# INLINE zipWithMSerial #-}
89−zipWithM :: (IsStream t, Monad m) => (a -> b -> m c) -> t m a -> t m b -> t m c
94+ Monad m => (a -> b -> m c) -> SerialT m a -> SerialT m b -> SerialT m c
90−zipWithM f m1 m2 = P.fromStreamS $ S.zipWithM f (P.toStreamS m1) (P.toStreamS m2)
95+zipWithMSerial f m1 m2 =
91−
96+ D.fromStreamD $ D.zipWithM f (D.toStreamD m1) (D.toStreamD m2)
92−-- | Zip two streams serially using a pure zipping function.
98+-- | Zip two streams serially using a pure zipping function. The zipping
99+-- function is applied concurrently for concurrent streams.
95-- > S.toList $ S.zipWith (+) (S.fromList [1,2,3]) (S.fromList [4,5,6])
102-- > S.toList $ S.zipWith (+) (S.fromList [1,2,3]) (S.fromList [4,5,6])
@@ -97,9 +104,17 @@ zipWithM f m1 m2 = P.fromStreamS $ S.zipWithM f (P.toStreamS m1) (P.toStreamS m2
99-- @since 0.1.0
106-- @since 0.1.0
100−{-# INLINABLE zipWith #-}
107+{-# INLINE_EARLY zipWith #-}
109+ (IsStream t, MonadAsync m) => (a -> b -> c) -> t m a -> t m b -> t m c
110+zipWith f m1 m2 = K.fromStream $ K.zipWith f (K.toStream m1) (K.toStream m2)
112+{-# RULES "zipWith serial" zipWith = zipWithSerial #-}
113+{-# INLINE zipWithSerial #-}
101−zipWith :: (IsStream t, Monad m) => (a -> b -> c) -> t m a -> t m b -> t m c
115+ Monad m => (a -> b -> c) -> SerialT m a -> SerialT m b -> SerialT m c
102−zipWith f m1 m2 = P.fromStreamS $ S.zipWith f (P.toStreamS m1) (P.toStreamS m2)
116+zipWithSerial f m1 m2 =
117+ D.fromStreamD $ D.zipWith f (D.toStreamD m1) (D.toStreamD m2)
104------------------------------------------------------------------------------
119------------------------------------------------------------------------------
105-- Parallel Zipping
120-- Parallel Zipping
@@ -204,7 +219,10 @@ instance Monad m => Functor (ZipSerialM m) where
204instance Monad m => Applicative (ZipSerialM m) where
219instance Monad m => Applicative (ZipSerialM m) where
205 pure = ZipSerialM . K.repeat
220 pure = ZipSerialM . K.repeat
206 {-# INLINE (<*>) #-}
221 {-# INLINE (<*>) #-}
207− (<*>) = zipWith id
222+ m1 <*> m2 = fromStream $ toStream $ zipWithSerial id m1_ m2_
224+ m1_ = fromStream (toStream m1)
225+ m2_ = fromStream (toStream m2)
209FOLDABLE_INSTANCE(ZipSerialM)
227FOLDABLE_INSTANCE(ZipSerialM)
210TRAVERSABLE_INSTANCE(ZipSerialM)
228TRAVERSABLE_INSTANCE(ZipSerialM)