monad-gen-0.2.0.0: src/Control/Monad/Gen/Class.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE CPP #-}
module Control.Monad.Gen.Class where
-- Import the non-depricated one
#if MIN_VERSION_mtl(2, 2, 1)
import Control.Monad.Except
#else
import Control.Monad.Trans.Error
#endif
import Control.Monad.Cont
import Control.Monad.List
import Control.Monad.RWS
import Control.Monad.Reader
import Control.Monad.State
import qualified Control.Monad.State.Strict as SS
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Writer
import qualified Control.Monad.Writer.Strict as SW
-- | The MTL style class for generating fresh values
class Monad m => MonadGen e m | m -> e where
-- | Generate a fresh value @e@, @gen@ should never produce the
-- same value within a monadic computation.
gen :: m e
instance MonadGen e m => MonadGen e (IdentityT m) where
gen = lift gen
instance MonadGen e m => MonadGen e (StateT s m) where
gen = lift gen
instance MonadGen e m => MonadGen e (ReaderT s m) where
gen = lift gen
instance (MonadGen e m, Monoid s) => MonadGen e (WriterT s m) where
gen = lift gen
instance MonadGen e m => MonadGen e (ListT m) where
gen = lift gen
instance MonadGen e m => MonadGen e (MaybeT m) where
gen = lift gen
instance MonadGen e m => MonadGen e (ContT r m) where
gen = lift gen
instance (Monoid w, MonadGen e m) => MonadGen e (RWST r w s m) where
gen = lift gen
instance MonadGen e m => MonadGen e (SS.StateT s m) where
gen = lift gen
instance (Monoid w, MonadGen e m) => MonadGen e (SW.WriterT w m) where
gen = lift gen
#if MIN_VERSION_mtl(2, 2, 1)
instance (MonadGen e m) => MonadGen e (ExceptT e m) where
gen = lift gen
#else
instance (MonadGen e m, Error err) => MonadGen e (ErrorT err m) where
gen = lift gen
#endif