@@ -19,7 +19,8 @@ import Data.Maybe (fromJust)
1919import Prelude
2020 (Monad, Int, (+), ($), (.), return, fmap, even, (>), (<=), (==), (>=),
2121 subtract, undefined, Maybe(..), odd, Bool, not, (>>=), mapM_, curry,
22− maxBound, div, IO, compare, Double, fromIntegral, Integer, (<$>), (<*>))
22+ maxBound, div, IO, compare, Double, fromIntegral, Integer, (<$>),
23+ (<*>), flip)
2324import qualified Prelude as P
2425import qualified Data.Foldable as F
2526import qualified GHC.Exts as GHC
@@ -170,22 +171,32 @@ toList :: Monad m => Stream m Int -> m [Int]
170171{-# INLINE find #-}
171172{-# INLINE findIndex #-}
172173{-# INLINE elemIndex #-}
173−{-# INLINE foldl1' #-}
174−{-# INLINE foldr1 #-}
175−last, minimum, maximum, find, findIndex, elemIndex, foldl1', foldr1
174+{-# INLINE foldl1'Reduce #-}
175+{-# INLINE foldr1Reduce #-}
176+last, minimum, maximum, find, findIndex, elemIndex, foldl1'Reduce, foldr1Reduce
176177 :: Monad m => Stream m Int -> m (Maybe Int)
177178
178179{-# INLINE minimumBy #-}
179180{-# INLINE maximumBy #-}
180181minimumBy, maximumBy :: Monad m => Stream m Int -> m (Maybe Int)
181182
182−{-# INLINE foldl' #-}
183−{-# INLINE foldr #-}
184−{-# INLINE foldrM #-}
183+{-# INLINE foldl'Reduce #-}
184+{-# INLINE foldlM'Reduce #-}
185+{-# INLINE foldrReduce #-}
185186{-# INLINE length #-}
186187{-# INLINE sum #-}
187188{-# INLINE product #-}
188−foldl', foldr, foldrM, length, sum, product :: Monad m => Stream m Int -> m Int
189+foldl'Reduce, foldlM'Reduce, foldrReduce, length, sum, product
190+ :: Monad m
191+ => Stream m Int -> m Int
192+
193+{-# INLINE foldl'Build #-}
194+{-# INLINE foldlM'Build #-}
195+{-# INLINE foldrBuild #-}
196+{-# INLINE foldrMBuild #-}
197+foldrBuild, foldrMBuild, foldl'Build, foldlM'Build
198+ :: Monad m
199+ => Stream m Int -> m [Int]
189200
190201{-# INLINE all #-}
191202{-# INLINE any #-}
@@ -228,11 +239,18 @@ mapM_ :: Monad m => Stream m Int -> m ()
228239mapM_ = S.mapM_ (\_ -> return ())
229240
230241toList = S.toList
231−foldr = S.foldr (+) 0
232−foldr1 = S.foldr1 (+)
233−foldrM = S.foldrM (\a xs -> return $ a + xs) 0
234−foldl' = S.foldl' (+) 0
235−foldl1' = S.foldl1' (+)
242+
243+foldl'Build = S.foldl' (flip (:)) []
244+foldrBuild = S.foldr (:) []
245+foldlM'Build = S.foldlM' (\xs x -> return $ x : xs) []
246+foldrMBuild = S.foldrM (\x xs -> return $ x : xs) []
247+
248+foldrReduce = S.foldr (+) 0
249+foldr1Reduce = S.foldr1 (+)
250+foldl'Reduce = S.foldl' (+) 0
251+foldl1'Reduce = S.foldl1' (+)
252+foldlM'Reduce = S.foldlM' (\xs a -> return $ a + xs) 0
253+
236254last = S.last
237255elem = S.elem maxValue
238256notElem = S.notElem maxValue