packages feed

monad-gen 0.2.0.3 → 0.3.0.0

raw patch · 2 files changed

+49/−21 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Control.Monad.Gen: instance (Monad m, Enum e) => MonadGen e (GenT e m)
+ Control.Monad.Gen: data Successor a
+ Control.Monad.Gen: instance Monad m => MonadGen e (GenT e m)
+ Control.Monad.Gen: runGenFrom :: Enum e => e -> Gen e a -> a
+ Control.Monad.Gen: runGenTFrom :: (Monad m, Enum e) => e -> GenT e m a -> m a
+ Control.Monad.Gen: successor :: (e -> e) -> Successor e
- Control.Monad.Gen: runGenTWith :: Monad m => e -> GenT e m a -> m a
+ Control.Monad.Gen: runGenTWith :: Monad m => Successor e -> e -> GenT e m a -> m a
- Control.Monad.Gen: runGenWith :: e -> Gen e a -> a
+ Control.Monad.Gen: runGenWith :: Successor e -> e -> Gen e a -> a

Files

monad-gen.cabal view
@@ -1,5 +1,5 @@ name:                monad-gen-version:             0.2.0.3+version:             0.3.0.0 synopsis:            A simple monad for generating fresh integers description:     This module provides a simple monad transformer @GenT@ to enumerate unique values within
src/Control/Monad/Gen.hs view
@@ -5,10 +5,14 @@        ( GenT        , Gen        , module Control.Monad.Gen.Class+       , Successor+       , successor        , runGenT        , runGen        , runGenTWith-       , runGenWith) where+       , runGenWith+       , runGenTFrom+       , runGenFrom) where #if MIN_VERSION_mtl(2, 2, 1) import Control.Monad.Except #else@@ -16,23 +20,32 @@ #endif  import Control.Applicative-import Control.Monad.Identity import Control.Monad.Cont.Class+import Control.Monad.Gen.Class+import Control.Monad.Identity+import Control.Monad.Reader import Control.Monad.Reader.Class import Control.Monad.State import Control.Monad.Writer.Class-import Control.Monad.Gen.Class +newtype Successor a = Successor {suc :: a -> a}+ -- | The monad transformer for generating fresh values.-newtype GenT e m a = GenT {unGenT :: StateT e m a}+data GenT e m a = GenT {unGenT :: ReaderT (Successor e) (StateT e m) a}                    deriving(Functor) -instance (Monad m, Enum e) => MonadGen e (GenT e m) where-  gen = GenT (modify succ) >> GenT get+instance Monad m => MonadGen e (GenT e m) where+  gen = GenT $ do+    s <- asks suc+    modify s+    get  instance Monad m => Monad (GenT e m) where   return = GenT . return   (GenT m) >>= f = GenT $ m >>= unGenT . f+instance MonadPlus m =>  MonadPlus (GenT e m) where+  mzero = GenT mzero+  mplus (GenT m) (GenT m') = GenT $ mplus m m' instance (Functor f, Monad f) => Applicative (GenT e f) where   pure = GenT . pure   (GenT f) <*> (GenT a) = GenT $ f <*> a@@ -43,23 +56,20 @@ type Gen e = GenT e Identity  instance MonadTrans (GenT e) where-  lift = GenT . lift+  lift = GenT . lift . lift  instance MonadReader r m => MonadReader r (GenT e m) where-  local f = GenT . local f . unGenT-  ask     = GenT ask+  local f m = GenT $ ask >>= lift . local f . runReaderT (unGenT m)+  ask     = GenT (lift ask) instance MonadState s m => MonadState s (GenT e m) where-  get    = GenT $ lift get-  put    = GenT . lift . put+  get    = GenT $ (lift . lift) get+  put    = GenT . lift . lift . put instance (MonadWriter w m) => MonadWriter w (GenT e m) where   tell m = lift $ tell m   listen = GenT . listen . unGenT   pass   = GenT . pass . unGenT instance MonadFix m => MonadFix (GenT e m) where   mfix = GenT . mfix . (unGenT .)-instance MonadPlus m =>  MonadPlus (GenT e m) where-  mzero = GenT mzero-  mplus (GenT m) (GenT m') = GenT $ mplus m m' instance MonadIO m => MonadIO (GenT e m) where   liftIO = GenT . liftIO instance MonadCont m => MonadCont (GenT e m) where@@ -72,20 +82,38 @@   catchError m h = GenT $ catchError (unGenT m) (unGenT . h) #endif +successor :: (e -> e) -> Successor e+successor = Successor++enumSucc :: Enum e => Successor e+enumSucc = Successor succ+ -- | Run a @GenT@ computation starting from the value -- @toEnum 0@ runGenT :: (Enum e, Monad m) => GenT e m a -> m a-runGenT = runGenTWith (toEnum 0)+runGenT = runGenTFrom (toEnum 0)  -- | Run a @Gen@ computation starting from the value -- @toEnum 0@ runGen :: Enum e => Gen e a -> a-runGen = runGenWith (toEnum 0)+runGen = runGenFrom (toEnum 0)  -- | Run a @GenT@ computation starting from a specific value @e@.-runGenTWith :: Monad m => e -> GenT e m a -> m a-runGenTWith e = flip evalStateT e . unGenT+runGenTFrom :: (Monad m, Enum e) => e -> GenT e m a -> m a+runGenTFrom e = runGenTWith enumSucc e  -- | Run a @Gen@ computation starting from a specific value @e@.-runGenWith :: e -> Gen e a -> a-runGenWith e = runIdentity . runGenTWith e+runGenFrom :: Enum e => e -> Gen e a -> a+runGenFrom e = runGenWith enumSucc e++-- | Run a @GenT@ computation starting from a specific value @e@ with+-- a the next fresh value determined by @Successor e@.+runGenTWith :: Monad m => Successor e -> e -> GenT e m a -> m a+runGenTWith s e = flip evalStateT e+                  . flip runReaderT s+                  . unGenT++-- | Run a @GenT@ computation starting from a specific value @e@ with+-- a the next fresh value determined by @Successor e@.+runGenWith :: Successor e -> e -> Gen e a -> a+runGenWith s e = runIdentity . runGenTWith s e