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)