@@ -56,7 +56,7 @@ module Streamly.Internal.Data.Fold
57 , rollingHash
57 , rollingHash
58 , rollingHashWithSalt
58 , rollingHashWithSalt
59− -- , rollingHashFirstN
59+ , rollingHashFirstN
60 -- , rollingHashLastN
60 -- , rollingHashLastN
62 -- ** Full Folds (Monoidal)
62 -- ** Full Folds (Monoidal)
@@ -70,8 +70,8 @@ module Streamly.Internal.Data.Fold
70 , toListRevF -- experimental
70 , toListRevF -- experimental
72 -- ** Partial Folds
72 -- ** Partial Folds
73− -- , drainN
73+ , drainN
74− -- , drainWhile
74+ , drainWhile
75 -- , lastN
75 -- , lastN
77 -- , genericIndex
77 -- , genericIndex
@@ -563,6 +563,14 @@ defaultSalt = 0x087fc72c
563rollingHash :: (Monad m, Enum a) => Fold m a Int
563rollingHash :: (Monad m, Enum a) => Fold m a Int
564rollingHash = rollingHashWithSalt defaultSalt
564rollingHash = rollingHashWithSalt defaultSalt
566+-- | Compute an 'Int' sized polynomial rolling hash of the first n elements of
569+-- > rollingHashFirstN = ltake n rollingHash
570+{-# INLINABLE rollingHashFirstN #-}
571+rollingHashFirstN :: (Monad m, Enum a) => Int -> Fold m a Int
572+rollingHashFirstN n = ltake n rollingHash
566------------------------------------------------------------------------------
574------------------------------------------------------------------------------
567-- Monoidal left folds
575-- Monoidal left folds
568------------------------------------------------------------------------------
576------------------------------------------------------------------------------
@@ -631,6 +639,18 @@ toList = Fold (\f x -> return $ f . (x :))
631-- Partial Folds
639-- Partial Folds
632------------------------------------------------------------------------------
640------------------------------------------------------------------------------
642+-- | A fold that drains the first n elements of its input, running the effects
643+-- and discarding the results.
644+{-# INLINABLE drainN #-}
645+drainN :: Monad m => Int -> Fold m a ()
646+drainN n = ltake n drain
648+-- | A fold that drains elements of its input as long as the predicate succeeds,
649+-- running the effects and discarding the results.
650+{-# INLINABLE drainWhile #-}
651+drainWhile :: Monad m => (a -> Bool) -> Fold m a ()
652+drainWhile p = ltakeWhile p drain
634------------------------------------------------------------------------------
654------------------------------------------------------------------------------
635-- To Elements
655-- To Elements
636------------------------------------------------------------------------------
656------------------------------------------------------------------------------