streamly-0.10.0: src/Streamly/Data/Fold/Prelude.hs
-- |
-- Module : Streamly.Data.Fold.Prelude
-- Copyright : (c) 2021 Composewell Technologies
-- License : BSD-3-Clause
-- Maintainer : streamly@composewell.com
-- Stability : released
-- Portability : GHC
--
-- All Fold related combinators including the streamly-core
-- "Streamly.Data.Fold" module, concurrency, unordered container operations.
--
module Streamly.Data.Fold.Prelude
(
-- * "Streamly.Data.Fold"
-- | All "Streamly.Data.Fold" combinators are re-exported via this
-- module. For more pre-release combinators also see
-- "Streamly.Internal.Data.Fold" module.
module Streamly.Data.Fold
-- * Concurrent Operations
-- ** Configuration
, Config
, maxBuffer
, boundThreads
, inspect
-- ** Combinators
, parEval
-- * Container Related
, toHashMapIO
)
where
import Control.Monad.IO.Class (MonadIO)
import Data.HashMap.Strict (HashMap)
import Data.Hashable (Hashable)
import Streamly.Data.Fold
import Streamly.Internal.Data.Fold (toContainerIO)
import Streamly.Internal.Data.Fold.Concurrent
import Streamly.Internal.Data.IsMap.HashMap ()
-- | Split the input stream based on a hashable component of the key field and
-- fold each split using the given fold. Useful for map/reduce, bucketizing
-- the input in different bins or for generating histograms.
--
-- >>> import Data.HashMap.Strict (HashMap, fromList)
-- >>> import qualified Streamly.Data.Fold.Prelude as Fold
-- >>> import qualified Streamly.Data.Stream as Stream
--
-- Consider a stream of key value pairs:
--
-- >>> input = Stream.fromList [("k1",1),("k1",1.1),("k2",2), ("k2",2.2)]
--
-- Classify each key to a different hash bin and fold the bins:
--
-- >>> classify = Fold.toHashMapIO fst (Fold.lmap snd Fold.toList)
-- >>> Stream.fold classify input :: IO (HashMap String [Double])
-- fromList [("k2",[2.0,2.2]),("k1",[1.0,1.1])]
--
-- /Pre-release/
--
{-# INLINE toHashMapIO #-}
toHashMapIO :: (MonadIO m, Hashable k, Ord k) =>
(a -> k) -> Fold m a b -> Fold m a (HashMap k b)
toHashMapIO = toContainerIO