@@ -56,7 +56,7 @@ module Streamly.Internal.Data.Fold
5656 , stdDev
5757 , rollingHash
5858 , rollingHashWithSalt
59− -- , rollingHashFirstN
59+ , rollingHashFirstN
6060 -- , rollingHashLastN
6161
6262 -- ** Full Folds (Monoidal)
@@ -70,8 +70,8 @@ module Streamly.Internal.Data.Fold
7070 , toListRevF -- experimental
7171
7272 -- ** Partial Folds
73− -- , drainN
74− -- , drainWhile
73+ , drainN
74+ , drainWhile
7575 -- , lastN
7676 -- , (!!)
7777 -- , genericIndex
@@ -563,6 +563,14 @@ defaultSalt = 0x087fc72c
563563rollingHash :: (Monad m, Enum a) => Fold m a Int
564564rollingHash = rollingHashWithSalt defaultSalt
565565
566+-- | Compute an 'Int' sized polynomial rolling hash of the first n elements of
567+-- a stream.
568+--
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
573+
566574------------------------------------------------------------------------------
567575-- Monoidal left folds
568576------------------------------------------------------------------------------
@@ -631,6 +639,18 @@ toList = Fold (\f x -> return $ f . (x :))
631639-- Partial Folds
632640------------------------------------------------------------------------------
633641
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
647+
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
653+
634654------------------------------------------------------------------------------
635655-- To Elements
636656------------------------------------------------------------------------------