module Control.Monad.HT where
untilM :: (Monad m) => (a -> Bool) -> m a -> m a
untilM p m =
do x <- m
if p x
then return x
else untilM p m
iterateLimitM :: Monad m => Int -> (a -> m a) -> a -> m [a]
iterateLimitM m f =
let aux 0 x = return [x]
aux n x = do y <- f x
z <- aux (n1) y
return (x : z)
in aux m
andLazy :: (Monad m) => m Bool -> m Bool -> m Bool
andLazy m0 m1 =
m0 >>= \b ->
if b
then m1
else return False
orLazy :: (Monad m) => m Bool -> m Bool -> m Bool
orLazy m0 m1 =
m0 >>= \b ->
if b
then return True
else m1