-- File created: 2008-02-24 21:12:25 module Coadjute.Util.Monad (anyM, allM, whenM, whileM, untilM) where import Control.Monad (liftM, when) anyM, allM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool anyM _ [] = return False anyM p (x:xs) = p x >>= \b -> if b then return True else anyM p xs allM _ [] = return True allM p (x:xs) = p x >>= \b -> if b then allM p xs else return False whenM :: (Monad m) => m Bool -> m a -> m () whenM cond body = cond >>= \c -> when c (body >> return ()) whileM, untilM :: (Monad m) => m Bool -> m a -> m () whileM cond body = whenM cond (body >> whileM cond body) untilM = whileM . liftM not