module Control.Monad.Trans.Operations where import Data.Maybe import Control.Monad import Control.Monad.Maybe import Control.Monad.List import Control.Monad.State.Class repeatMaybe :: Monad m => MaybeT m a -> ListT m a repeatMaybe m = lift (runMaybeT m) >>= maybe mzero (\ x -> return x `mplus` repeatMaybe m) statefully :: MonadState s m => (s -> (a, s)) -> m a statefully f = do s <- get let (x, s') = f s put s' return x (>>=?) :: Monad m => m (Maybe a) -> (a -> m ()) -> m () m >>=? f = m >>= maybe (return ()) f execMaybeT :: Monad m => MaybeT m () -> m () execMaybeT = liftM (fromMaybe ()) . runMaybeT