-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | A simple monad for generating fresh integers
--   
--   This module provides a simple monad transformer <tt>GenT</tt> to
--   enumerate unique values within a monadic computation. It also plays
--   nicely with everything in the MTL.
@package monad-gen
@version 0.3.0.1

module Control.Monad.Gen.Class

-- | The MTL style class for generating fresh values
class Monad m => MonadGen e m | m -> e

-- | Generate a fresh value <tt>e</tt>, <tt>gen</tt> should never produce
--   the same value within a monadic computation.
gen :: MonadGen e m => m e
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Identity.IdentityT m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.State.Lazy.StateT s m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Reader.ReaderT s m)
instance (Control.Monad.Gen.Class.MonadGen e m, GHC.Base.Monoid s) => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Writer.Lazy.WriterT s m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.List.ListT m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Maybe.MaybeT m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Cont.ContT r m)
instance (GHC.Base.Monoid w, Control.Monad.Gen.Class.MonadGen e m) => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.State.Strict.StateT s m)
instance (GHC.Base.Monoid w, Control.Monad.Gen.Class.MonadGen e m) => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance Control.Monad.Gen.Class.MonadGen e m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Trans.Except.ExceptT e' m)

module Control.Monad.Gen

-- | The monad transformer for generating fresh values.
data GenT e m a
type Gen e = GenT e Identity
data Successor a
successor :: (e -> e) -> Successor e

-- | Run a <tt>GenT</tt> computation starting from the value <tt>toEnum
--   0</tt>
runGenT :: (Enum e, Monad m) => GenT e m a -> m a

-- | Run a <tt>Gen</tt> computation starting from the value <tt>toEnum
--   0</tt>
runGen :: Enum e => Gen e a -> a

-- | Run a <tt>GenT</tt> computation starting from a specific value
--   <tt>e</tt> with a the next fresh value determined by <tt>Successor
--   e</tt>.
runGenTWith :: Monad m => Successor e -> e -> GenT e m a -> m a

-- | Run a <tt>GenT</tt> computation starting from a specific value
--   <tt>e</tt> with a the next fresh value determined by <tt>Successor
--   e</tt>.
runGenWith :: Successor e -> e -> Gen e a -> a

-- | Run a <tt>GenT</tt> computation starting from a specific value
--   <tt>e</tt>.
runGenTFrom :: (Monad m, Enum e) => e -> GenT e m a -> m a

-- | Run a <tt>Gen</tt> computation starting from a specific value
--   <tt>e</tt>.
runGenFrom :: Enum e => e -> Gen e a -> a
instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Gen.GenT e m)
instance GHC.Base.Monad m => Control.Monad.Gen.Class.MonadGen e (Control.Monad.Gen.GenT e m)
instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.Gen.GenT e m)
instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Control.Monad.Gen.GenT e m)
instance (GHC.Base.Functor f, GHC.Base.Monad f) => GHC.Base.Applicative (Control.Monad.Gen.GenT e f)
instance (GHC.Base.Monad m, GHC.Base.Functor m, GHC.Base.MonadPlus m) => GHC.Base.Alternative (Control.Monad.Gen.GenT e m)
instance Control.Monad.Trans.Class.MonadTrans (Control.Monad.Gen.GenT e)
instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Control.Monad.Gen.GenT e m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Control.Monad.Gen.GenT e m)
instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Control.Monad.Gen.GenT e m)
instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Control.Monad.Gen.GenT e m)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Monad.Gen.GenT e m)
instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (Control.Monad.Gen.GenT e m)
instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (Control.Monad.Gen.GenT e' m)
