module Control.Monad.Extensions (satisfiesM,if') where import Control.Applicative (liftA3) satisfiesM :: Monad m => (a -> Bool) -> m a -> m a satisfiesM :: (a -> Bool) -> m a -> m a satisfiesM a -> Bool p m a x = m a x m a -> (a -> m a) -> m a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= (a -> Bool) -> (a -> m a) -> (a -> m a) -> a -> m a forall (f :: * -> *) a. Applicative f => f Bool -> f a -> f a -> f a if' a -> Bool p a -> m a forall (m :: * -> *) a. Monad m => a -> m a return (m a -> a -> m a forall a b. a -> b -> a const ((a -> Bool) -> m a -> m a forall (m :: * -> *) a. Monad m => (a -> Bool) -> m a -> m a satisfiesM a -> Bool p m a x)) if' :: Applicative f => f Bool -> f a -> f a -> f a if' :: f Bool -> f a -> f a -> f a if' = (Bool -> a -> a -> a) -> f Bool -> f a -> f a -> f a forall (f :: * -> *) a b c d. Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d liftA3 (\ Bool c a t a e -> if Bool c then a t else a e)