module Control.Monad.HT where
import Control.Monad (liftM, liftM2, )
import Prelude hiding (repeat, until, )
infixr 1 <=<
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
(<=<) f g = (f =<<) . g
repeat :: (Monad m) => m a -> m [a]
repeat x =
let go = liftM2 (:) x go in go
until, untilM :: (Monad m) => (a -> Bool) -> m a -> m a
untilM = until
until p m =
let go =
do x <- m
if p x
then return x
else go
in go
iterateLimit, iterateLimitM :: Monad m => Int -> (a -> m a) -> a -> m [a]
iterateLimitM = iterateLimit
iterateLimit m f =
let aux n x =
liftM (x:) $
if n==0
then return []
else aux (n1) =<< f x
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