module Data.Pipe.Flow (before, until) where import Prelude hiding (until) import Control.Monad import Data.Pipe before :: (PipeClass p, Monad m, Monad (p a a m)) => (a -> Bool) -> p a a m () before p = await >>= maybe (return ()) (\x -> unless (p x) $ yield x >> before p) until :: (PipeClass p, Monad m, Monad (p a a m)) => (a -> Bool) -> p a a m () until p = (await >>=) . maybe (return ()) $ \x -> if p x then yield x else yield x >> before p