module Control.Monad.Utils ( ifM , whenM , unlessM , doWhile_ , doWhile ) where import Control.Monad (when, unless) doWhile :: Monad m => a -> (a -> m (a, Bool)) -> m a doWhile i act = do (r, p) <- act i if p then doWhile r act else return r doWhile_ :: Monad m => m Bool -> m () doWhile_ act = do p <- act when p $ doWhile_ act ifM :: Monad m => m Bool -> m a -> m a -> m a ifM p t e = do b <- p if b then t else e whenM, unlessM :: Monad m => m Bool -> m () -> m () whenM p t = p >>= flip when t unlessM p e = p >>= flip unless e