module Data.MQueue.MonadHelpers where import Data.Function with :: Monad m => m a -> (a -> m b) -> m a with m f = do ans <- m f ans return ans when_ :: Monad m => Bool -> m a -> m () when_ True act = act >> return () when_ False _ = return () whileM :: Monad m => m Bool -> m a -> m () whileM cond act = fix (\ action -> cond >>= flip when_ (act >> action))