on master help sign in
Add Prelude#intersperseM
commit970606715928b000fb1df1b27dd9057ad6717136 authorVeladus <veladus@web.de> dateMon 23 Jul 2018, 21:35 (8 years ago) parent74ce247
3 files changed+38−1
src/Streamly/Prelude.hs+13 src/Streamly/Streams/StreamK.hs+19 test/Prop.hs+6−1
src/Streamly/Prelude.hs+13
@@ -151,6 +151,9 @@ module Streamly.Prelude
151151 -- ** Reordering
152152 , reverse
153153
154+ -- ** Inserting
155+ , intersperseM
156+
154157 -- * Zipping
155158 , zipWith
156159 , zipWithM
@@ -872,6 +875,16 @@ reverse m = fromStream $ go K.nil (toStream m)
872875 yieldk a r = runIt $ go (a `K.cons` rev) r
873876 in K.unStream rest (rstState st) stop single yieldk
874877
878+------------------------------------------------------------------------------
879+-- Transformation by Inserting
880+------------------------------------------------------------------------------
881+
882+-- | Generate a stream by performing the monadic action inbetween all elements
883+-- of the given stream.
884+{-# INLINE intersperseM #-}
885+intersperseM :: (IsStream t, MonadAsync m) => m a -> t m a -> t m a
886+intersperseM = K.intersperseM
887+
875888------------------------------------------------------------------------------
876889-- Zipping
877890------------------------------------------------------------------------------
src/Streamly/Streams/StreamK.hs+19
@@ -117,6 +117,9 @@ module Streamly.Streams.StreamK
117117 , mapM
118118 , sequence
119119
120+ -- ** Inserting
121+ , intersperseM
122+
120123 -- ** Map and Filter
121124 , mapMaybe
122125
@@ -849,6 +852,22 @@ sequence m = go (toStream m)
849852 yieldk ma r = unStream (toStream $ ma |: go r) st stp sng yld
850853 in (unStream m1) (rstState st) stp single yieldk
851854
855+-------------------------------------------------------------------------------
856+-- Inserting
857+-------------------------------------------------------------------------------
858+
859+{-# INLINE intersperseM #-}
860+intersperseM :: (IsStream t, MonadAsync m) => m a -> t m a -> t m a
861+intersperseM a m = fromStream $ prependingStart (toStream m)
862+ where
863+ prependingStart m1 = Stream $ \st stp sng yld ->
864+ let yieldk i x = unStream (return i |: go x) st stp sng yld
865+ in unStream m1 (rstState st) stp sng yieldk
866+ go m2 = fromStream $ Stream $ \st stp sng yld ->
867+ let single i = unStream (a |: yield i) st stp sng yld
868+ yieldk i x = unStream (a |: return i |: go x) st stp sng yld
869+ in unStream m2 (rstState st) stp single yieldk
870+
852871-------------------------------------------------------------------------------
853872-- Map and Filter
854873-------------------------------------------------------------------------------
test/Prop.hs+6−1
@@ -10,7 +10,7 @@ import Control.Concurrent (MVar, takeMVar, putMVar, newEmptyMVar)
1010import Control.Monad (replicateM, replicateM_)
1111import Data.IORef (readIORef, modifyIORef, newIORef)
1212import Data.List (sort, foldl', scanl', findIndices, findIndex, elemIndices,
13− elemIndex, find)
13+ elemIndex, find, intersperse)
1414import Data.Maybe (mapMaybe)
1515import GHC.Word (Word8)
1616
@@ -351,6 +351,8 @@ transformOps constr desc t eq = do
351351 prop (desc ++ " findIndices") $ transform (findIndices odd) $ t . (S.findIndices odd)
352352 prop (desc ++ " elemIndices") $ transform (elemIndices 3) $ t . (S.elemIndices 3)
353353
354+ prop (desc ++ " intersperseM") $ transform (intersperse 3) $ t . (S.intersperseM (return 3))
355+
354356
355357concurrentOps
356358 :: IsStream t
@@ -437,6 +439,9 @@ transformCombineOpsCommon constr desc t eq = do
437439 (S.scanlM' (\_ a -> return a) 0)
438440 prop (desc ++ " reverse") $ transform reverse t S.reverse
439441
442+ prop (desc ++ " intersperseM") $
443+ transform (intersperse 3) t (S.intersperseM $ return 3)
444+
440445transformCombineOpsOrdered
441446 :: (IsStream t, Semigroup (t IO Int))
442447 => ([Int] -> t IO Int)