Add various monadic folds over streams
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 16 Nov 2009 12:48:49 +0000 (12:48 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Mon, 16 Nov 2009 12:48:49 +0000 (12:48 +0000)
Data/Vector/Fusion/Stream.hs
Data/Vector/Fusion/Stream/Monadic.hs

index 9b9522f..e87e58a 100644 (file)
@@ -67,7 +67,7 @@ module Data.Vector.Fusion.Stream (
   toList, fromList, liftStream,
 
   -- * Monadic combinators
-  mapM_, foldM
+  mapM_, foldM, fold1M, foldM', fold1M'
 ) where
 
 import Data.Vector.Fusion.Stream.Size
@@ -451,6 +451,22 @@ foldM :: Monad m => (a -> b -> m a) -> a -> Stream b -> m a
 {-# INLINE_STREAM foldM #-}
 foldM m z = M.foldM m z . liftStream
 
+-- | Monadic fold over non-empty stream
+fold1M :: Monad m => (a -> a -> m a) -> Stream a -> m a
+{-# INLINE fold1M #-}
+fold1M m = M.fold1M m . liftStream
+
+-- | Monadic fold with strict accumulator
+foldM' :: Monad m => (a -> b -> m a) -> a -> Stream b -> m a
+{-# INLINE foldM' #-}
+foldM' m z = M.foldM' m z . liftStream
+
+-- | Monad fold over non-empty stream with strict accumulator
+fold1M' :: Monad m => (a -> a -> m a) -> Stream a -> m a
+{-# INLINE fold1M' #-}
+fold1M' m = M.fold1M' m . liftStream
+
+
 -- Conversions
 -- -----------
 
index 955da6c..7960075 100644 (file)
@@ -45,8 +45,8 @@ module Data.Vector.Fusion.Stream.Monadic (
   elem, notElem, find, findM, findIndex, findIndexM,
 
   -- * Folding
-  foldl, foldlM, foldM, foldl1, foldl1M,
-  foldl', foldlM', foldl1', foldl1M',
+  foldl, foldlM, foldl1, foldl1M, foldM, fold1M,
+  foldl', foldlM', foldl1', foldl1M', foldM', fold1M',
   foldr, foldrM, foldr1, foldr1M,
 
   -- * Specialised folds
@@ -601,6 +601,11 @@ foldl1M f (Stream step s sz) = foldl1M_go s
                        Skip    s' -> foldl1M_go s'
                        Done       -> errorEmptyStream "foldl1M"
 
+-- | Same as 'foldl1M'
+fold1M :: Monad m => (a -> a -> m a) -> Stream m a -> m a
+{-# INLINE fold1M #-}
+fold1M = foldl1M
+
 -- | Left fold with a strict accumulator
 foldl' :: Monad m => (a -> b -> a) -> a -> Stream m b -> m a
 {-# INLINE foldl' #-}
@@ -619,6 +624,11 @@ foldlM' m z (Stream step s _) = foldlM'_go z s
                          Skip    s' -> foldlM'_go z s'
                          Done       -> return z
 
+-- | Same as 'foldlM''
+foldM' :: Monad m => (a -> b -> m a) -> a -> Stream m b -> m a
+{-# INLINE foldM' #-}
+foldM' = foldlM'
+
 -- | Left fold over a non-empty 'Stream' with a strict accumulator
 foldl1' :: Monad m => (a -> a -> a) -> Stream m a -> m a
 {-# INLINE foldl1' #-}
@@ -637,6 +647,11 @@ foldl1M' f (Stream step s sz) = foldl1M'_go s
                         Skip    s' -> foldl1M'_go s'
                         Done       -> errorEmptyStream "foldl1M'"
 
+-- | Same as 'foldl1M''
+fold1M' :: Monad m => (a -> a -> m a) -> Stream m a -> m a
+{-# INLINE fold1M' #-}
+fold1M' = foldl1M'
+
 -- | Right fold
 foldr :: Monad m => (a -> b -> b) -> b -> Stream m a -> m b
 {-# INLINE foldr #-}