@@ -35,6 +35,7 @@ module Streamly.Internal.Data.Fold.Window
37 , cumulative
37 , cumulative
39 -- ** Sums
40 -- ** Sums
@@ -59,11 +60,13 @@ import Streamly.Internal.Data.Fold.Type (Fold(..), Step(..))
59import Streamly.Internal.Data.Tuple.Strict
60import Streamly.Internal.Data.Tuple.Strict
60 (Tuple'(..), Tuple3Fused' (Tuple3Fused'))
61 (Tuple'(..), Tuple3Fused' (Tuple3Fused'))
62−import Prelude hiding (length, sum, minimum, maximum)
63+import qualified Data.Map as Map
64import qualified Streamly.Internal.Data.Fold.Type as Fold
64import qualified Streamly.Internal.Data.Fold.Type as Fold
65import qualified Streamly.Internal.Data.Ring.Foreign as Ring
65import qualified Streamly.Internal.Data.Ring.Foreign as Ring
67+import Prelude hiding (length, sum, minimum, maximum)
68-- >>> import Data.Bifunctor(bimap)
71-- >>> import Data.Bifunctor(bimap)
69-- >>> import qualified Streamly.Data.Fold as Fold
72-- >>> import qualified Streamly.Data.Fold as Fold
@@ -309,3 +312,39 @@ maximum n = fmap (fmap snd) $ range n
309{-# INLINE mean #-}
312{-# INLINE mean #-}
310mean :: forall m a. (Monad m, Fractional a) => Fold m (a, Maybe a) a
313mean :: forall m a. (Monad m, Fractional a) => Fold m (a, Maybe a) a
311mean = Fold.teeWith (/) sum length
314mean = Fold.teeWith (/) sum length
316+-- | Drop repeated elements within the specified
317+-- tumbling window in the stream.
320+-- >>> import qualified Streamly.Prelude as S
321+-- >>> S.fold nub $ S.fromList [(1, Nothing), (1, Nothing), (3, Nothing), (4, Just 1)]
322+-- fromList [(1,1),(3,1),(4,1)]
325+nub :: (Monad m, Ord a) => Fold m (a, Maybe a) (Map.Map a Int)
326+nub = Fold step initial extract
331+ return $ Partial Map.empty
333+ updateRefCounts new map0 = return $ Map.insertWith (+) new (1::Int) map0
335+ alter a m1 (Just v) =
338+ _ <- return $ Map.delete a m1
340+ else return $ Just (v -1)
341+ alter _ _ Nothing = error "Invalid old element"
343+ step map0 (new, mOld) = do
344+ m1 <- updateRefCounts new map0
347+ Just a -> Map.alterF (alter a m1) a m1
348+ Nothing -> return m1