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