module Data.Conduit.Misc where
import Data.Conduit
import Control.Monad
concat :: (Monad m) => Conduit [a] m a
concat = awaitForever (mapM_ yield)
concatFlush :: (Monad m) => Integer -> Conduit [a] m (Flush a)
concatFlush mx = concatFlush' 0
where
concatFlush' x = awaitE >>= either return (\input -> if null input
then yield Flush >> concatFlush' 0
else foldM sendf x input >>= concatFlush'
)
sendf curx ev = do
yield (Chunk ev)
if curx >= mx
then yield Flush >> return 0
else return (curx+1)
groupFlush :: (Monad m) => Conduit (Flush a) m [a]
groupFlush = grouper []
where
grouper lst = awaitE >>= either return (handle lst)
handle lst Flush = do
unless (null lst) (yield (reverse lst))
grouper []
handle lst (Chunk x) = grouper (x:lst)
mchunk :: b -> (a -> b) -> Flush a -> b
mchunk n _ Flush = n
mchunk _ f (Chunk x) = f x
mapFlushMaybe :: (Monad m) => (a -> Maybe b) -> Conduit (Flush a) m (Flush b)
mapFlushMaybe f = awaitForever $ mchunk (yield Flush) (maybe (return ()) (yield . Chunk) . f)