{-# LANGUAGE RankNTypes #-}
-- | Adapter module to work with the foldl package.
module Data.Conduit.Extra.Foldl where

import qualified Control.Foldl as F
import Data.Conduit
import Control.Monad.Trans.Class (lift)
import qualified Data.Conduit.List as CL

-- | Convert a 'F.Fold' into a 'Consumer'.
--
-- Since 0.1.6
sinkFold :: Monad m => F.Fold a b -> Consumer a m b
sinkFold (F.Fold f seed extract) = fmap extract (CL.fold f seed)

-- | Convert a 'F.FoldM' into a 'Consumer'.
--
-- Since 0.1.6
sinkFoldM :: Monad m => F.FoldM m a b -> Consumer a m b
sinkFoldM (F.FoldM f mseed extract) =
    lift mseed >>= CL.foldM f >>= lift . extract