module Control.Monad.Extra where -- | Like @if@, but where the test can be monadic. ifM :: Monad m => m Bool -> m a -> m a -> m a ifM :: m Bool -> m a -> m a -> m a ifM m Bool predicate m a t m a f = do Bool b <- m Bool predicate; if Bool b then m a t else m a f -- | Like 'when', but where the test can be monadic. whenM :: Monad m => m Bool -> m () -> m () whenM :: m Bool -> m () -> m () whenM m Bool b m () t = m Bool -> m () -> m () -> m () forall (m :: * -> *) a. Monad m => m Bool -> m a -> m a -> m a ifM m Bool b m () t (() -> m () forall (f :: * -> *) a. Applicative f => a -> f a pure ())