yjtools-0.1: Control/Monad/Utils.hs
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