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