{-# LANGUAGE Safe #-}
-- | This module exports a bunch of common folds.
--
-- For the classic example
--
-- > import           Control.Applicative
-- > import qualified Data.Fold.Common as C
-- >
-- > avg :: C.L' Double Double
-- > avg = (/) <$> C.sum <*> C.count
-- >
-- > main :: IO ()
-- > main = print $ C.run [1 .. 10000000] avg
--
-- This will run in constant memory as we'd hope.  In general the
-- rules for keeping memory usage low while using @folds@ are
--
--  * Don't try to consume a left fold lazily
--  * Don't try to consume a right fold strictly
--  * Never use '>>='
--  * Never use 'prefix' on right folds
--  * Never use 'postfix' on left folds
--
-- Also note that monoidal folds can be combined with strict left ones
-- with 'strictify'.
module Data.Fold.Common
       ( module Data.Fold
         -- * Left Folds
       , sum
       , product
       , count
       , mconcat
       , minimum
       , maximum
       , nub
       , slowNub
       , intoSet
       , last
       , nth
         -- * Monoidal Folds
       , any
       , all
       , and
       , or
       , elem
       , notElem
       , find
       , head
       , null
       , strictify
         -- * Right Folds
       , intoList
       , take
       , drop
       , indexOf
       , chunk
       , concat) where
import Prelude ()
import Data.Fold
import Data.Fold.Common.L'
import Data.Fold.Common.M
import Data.Fold.Common.R