stateful-mtl-1.0: Control/Monad/Trans/Operations.hs
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