module Data.Pipe.Flow (before, until) where

import Prelude hiding (until)
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 ->
	if p x then return () else 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