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