Control.Monad

module Control.Monad(
       module Control.Monad,module Monad,module Data.Functor,
       Monad(..),(=<<)) where
import Monad
import Data.Functor

replicateM  n x   = sequence  (replicate n x)
replicateM_ n x   = sequence_ (replicate n x)

forM_ x f = mapM_ f x

infixr 1 <=<,>=>

-- | Kleisli composition, right-to-left (monadic function composition)
(f <=< g) x = f =<< g x
(g >=> f) x = g x >>= f
-- ^ Kleisli composition, left-to-right

-- | Generalization of filter. @filter = mfilter :: (a->Bool) -> [a] -> [a]@
mfilter p ma = do a <- ma; if p a then return a else mzero

forever m = loop where loop = m >> loop