module Monadic(module Monadic, module Monad) where import Monad infixl 1 #, <# ( # ) :: Monad m => (a -> b) -> (m a -> m b) ( # ) = liftM (<#) :: Monad m => m (a -> b) -> m a -> m b (<#) = ap whenM :: Monad m => m Bool -> m () -> m () whenM p m = do b <- p; when b m unlessM :: Monad m => m Bool -> m () -> m () unlessM p m = whenM (notM p) m notM :: Monad m => m Bool -> m Bool notM p = liftM not p whileM :: Monad m => m Bool -> m () -> m () whileM p m = whenM p (m >> whileM p m) untilM :: Monad m => m () -> m Bool -> m () m `untilM` p = m >> unlessM p (m `untilM` p) m <&& n = do b <- m if b then n else return False m <|| n = do b <- m if b then return True else n allM p xs = foldr (<&&) (return True) (map p xs) anyM p xs = foldr (<||) (return False) (map p xs)