module Data.Conduit.Extra.Pipes
( (>->), (<-<)
, runPipe, runPipeR, runEffect
, forP, each
, take, peel
, replicateM
, tee
, module X
, module CL
) where
import Control.Monad.Trans.Class
import Data.Conduit as X
import Data.Conduit.List as CL hiding (take)
import Data.Foldable
import Data.Void
import Prelude hiding (take)
(>->) :: forall a b i o m. Monad m
=> ConduitM i a m () -> ConduitM a o m b -> ConduitM i o m b
(>->) = (=$=)
(<-<) :: forall a b i o m. Monad m
=> ConduitM a o m b -> ConduitM i a m () -> ConduitM i o m b
(<-<) = flip (>->)
runPipe :: forall m b. Monad m => ConduitM () Void m b -> m b
runPipe c = yield () $$ c
runEffect :: forall m b. Monad m => ConduitM () Void m b -> m b
runEffect = runPipe
runPipeR :: forall m b. (MonadBaseControl IO m, Monad m)
=> ConduitM () Void (ResourceT m) b -> m b
runPipeR = runResourceT . runPipe
forP :: Monad m => Source m a -> (a -> m ()) -> m ()
forP p a = p $$ CL.mapM_ a
take :: Monad m => Int -> Conduit a m a
take = CL.isolate
peel :: Monad m => Int -> m [()]
peel n = take n $$ CL.consume
each :: (Monad m, Foldable f) => f a -> Producer m a
each = Data.Foldable.mapM_ yield
replicateM :: Monad m => Int -> m a -> Producer m a
replicateM 0 _ = return ()
replicateM n m = lift m >>= yield >> replicateM (n1) m
tee :: Monad m => Sink a (ConduitM a a m) b -> ConduitM a a m b
tee c = go $$ c
where
go = do
x <- lift await
case x of
Nothing -> return ()
Just x' -> yield x' >> lift (yield x') >> go