packages feed

tardis 0.3.0.0 → 0.4.1.0

raw patch · 4 files changed

+33/−76 lines, 4 filesdep +mmorphdep ~basePVP ok

version bump matches the API change (PVP)

Dependencies added: mmorph

Dependency ranges changed: base

API changes (from Hackage documentation)

- Control.Monad.Tardis: instance MonadFix m => MonadState fw (TardisT bw fw m)
- Control.Monad.Tardis: instance MonadFix m => MonadTardis bw fw (TardisT bw fw m)
- Control.Monad.Trans.Tardis: data TardisT bw fw m a
- Control.Monad.Trans.Tardis: instance MonadFix m => Applicative (TardisT bw fw m)
- Control.Monad.Trans.Tardis: instance MonadFix m => Functor (TardisT bw fw m)
- Control.Monad.Trans.Tardis: instance MonadFix m => Monad (TardisT bw fw m)
- Control.Monad.Trans.Tardis: instance MonadFix m => MonadFix (TardisT bw fw m)
- Control.Monad.Trans.Tardis: instance MonadTrans (TardisT bw fw)
- Control.Monad.Trans.Tardis: runTardisT :: TardisT bw fw m a -> (bw, fw) -> m (a, (bw, fw))
+ Control.Monad.Tardis.Class: instance Control.Monad.Fix.MonadFix m => Control.Monad.Tardis.Class.MonadTardis bw fw (Control.Monad.Trans.Tardis.TardisT bw fw m)
+ Control.Monad.Trans.Tardis: TardisT :: ((bw, fw) -> m (a, (bw, fw))) -> TardisT bw fw m a
+ Control.Monad.Trans.Tardis: [runTardisT] :: TardisT bw fw m a -> (bw, fw) -> m (a, (bw, fw))
+ Control.Monad.Trans.Tardis: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Control.Monad.Trans.Tardis.TardisT bw fw m)
+ Control.Monad.Trans.Tardis: instance Control.Monad.Fix.MonadFix m => GHC.Base.Applicative (Control.Monad.Trans.Tardis.TardisT bw fw m)
+ Control.Monad.Trans.Tardis: instance Control.Monad.Fix.MonadFix m => GHC.Base.Functor (Control.Monad.Trans.Tardis.TardisT bw fw m)
+ Control.Monad.Trans.Tardis: instance Control.Monad.Fix.MonadFix m => GHC.Base.Monad (Control.Monad.Trans.Tardis.TardisT bw fw m)
+ Control.Monad.Trans.Tardis: instance Control.Monad.Morph.MFunctor (Control.Monad.Trans.Tardis.TardisT bw fw)
+ Control.Monad.Trans.Tardis: instance Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Tardis.TardisT bw fw)
+ Control.Monad.Trans.Tardis: mapTardisT :: (m (a, (bw, fw)) -> n (b, (bw, fw))) -> TardisT bw fw m a -> TardisT bw fw n b
+ Control.Monad.Trans.Tardis: newtype TardisT bw fw m a
- Control.Monad.Tardis.Class: class (Applicative m, MonadFix m) => MonadTardis bw fw m | m -> bw, m -> fw where getPast = tardis $ \ ~(bw, fw) -> (fw, (bw, fw)) getFuture = tardis $ \ ~(bw, fw) -> (bw, (bw, fw)) sendPast bw' = tardis $ \ ~(_bw, fw) -> ((), (bw', fw)) sendFuture fw' = tardis $ \ ~(bw, _fw) -> ((), (bw, fw')) tardis f = do { rec {let (a, (future', past')) = f (future, past) sendPast future' past <- getPast future <- getFuture}; sendFuture past'; return a }
+ Control.Monad.Tardis.Class: class (Applicative m, MonadFix m) => MonadTardis bw fw m | m -> bw, m -> fw where getPast = tardis $ \ ~(bw, fw) -> (fw, (bw, fw)) getFuture = tardis $ \ ~(bw, fw) -> (bw, (bw, fw)) sendPast bw' = tardis $ \ ~(_bw, fw) -> ((), (bw', fw)) sendFuture fw' = tardis $ \ ~(bw, _fw) -> ((), (bw, fw')) tardis f = do { rec { let (a, (future', past')) = f (future, past); sendPast future'; past <- getPast; future <- getFuture; sendFuture past' }; return a }

Files

Control/Monad/Tardis.hs view
@@ -1,24 +1,7 @@-{-# LANGUAGE CPP                        #-}-{-# OPTIONS_GHC -Wall -fno-warn-orphans #-}--{-# LANGUAGE DoRec                      #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE MultiParamTypeClasses      #-}-{-# LANGUAGE FunctionalDependencies     #-}--#ifdef USE_UNDECIDABLE_INSTANCES-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE UndecidableInstances       #-}-{-# LANGUAGE OverlappingInstances       #-}-#endif+{-# OPTIONS_GHC -Wall #-}  -- | This module re-exports both 'MonadTardis' and 'TardisT'--- (Wherever there is overlap, the 'MonadTardis' version is preferred.),--- as well as the 'TardisT' instance of 'MonadTardis'.--- If you installed this library with the use-undecidable-instances flag,--- then another instance was also exported:--- any 'MonadTrans' on top of any 'MonadTardis'--- is also a 'MonadTardis'.+-- (Wherever there is overlap, the 'MonadTardis' version is preferred.) --  -- The recommended usage of a Tardis is to import this module. module Control.Monad.Tardis@@ -34,15 +17,6 @@   ) where  -#ifdef USE_UNDECIDABLE_INSTANCES-import Control.Applicative (Applicative)-import Control.Monad.Trans (MonadTrans, lift)-#endif--import Control.Monad.Fix-import Control.Monad.State.Class--import qualified Control.Monad.Trans.Tardis as T import Control.Monad.Tardis.Class import Control.Monad.Trans.Tardis   ( TardisT@@ -58,31 +32,7 @@   , noState   ) -instance MonadFix m => MonadTardis bw fw (TardisT bw fw m) where-  getPast    = T.getPast-  getFuture  = T.getFuture-  sendPast   = T.sendPast-  sendFuture = T.sendFuture-  tardis     = T.tardis -instance MonadFix m => MonadState fw (TardisT bw fw m) where-  get = getPast-  put = sendFuture---#ifdef USE_UNDECIDABLE_INSTANCES-instance ( MonadTrans t-         , MonadTardis bw fw m-         , MonadFix (t m)-         , Applicative (t m)-         ) => MonadTardis bw fw (t m) where-  getPast    = lift getPast-  getFuture  = lift getFuture-  sendPast   = lift . sendPast-  sendFuture = lift . sendFuture-  tardis     = lift . tardis-#endif- {- $whatis     A Tardis is the combination of the State monad transformer     and the Reverse State monad transformer.@@ -171,7 +121,7 @@     This code is equivalent to the previous example:  > flip execTardis (10, "Dan") $ do->   modifyForwards (++ "Burton")+>   modifyForwards (++ " Burton") >   modifyBackwards (+ 1)  -}
Control/Monad/Tardis/Class.hs view
@@ -1,8 +1,10 @@-{-# OPTIONS_GHC -Wall               #-}-{-# LANGUAGE DoRec                  #-}+{-# OPTIONS_GHC -Wall -fno-warn-warnings-deprecations   #-}+{-# LANGUAGE DoRec                           #-} {-# LANGUAGE MultiParamTypeClasses  #-} {-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleInstances      #-} + -- | The class definition of a Tardis, -- as well as a few straightforward combinators -- based on its primitives.@@ -22,6 +24,8 @@ import Control.Applicative import Control.Monad.Fix +import qualified Control.Monad.Trans.Tardis as T+ -- | A Tardis is parameterized by two state streams: -- a 'backwards-traveling' state and a 'forwards-traveling' state. -- This library consistently puts the backwards-traveling state first@@ -95,3 +99,10 @@ getsFuture :: MonadTardis bw fw m => (bw -> a) -> m a getsFuture f = f <$> getFuture ++instance MonadFix m => MonadTardis bw fw (T.TardisT bw fw m) where+  getPast    = T.getPast+  getFuture  = T.getFuture+  sendPast   = T.sendPast+  sendFuture = T.sendFuture+  tardis     = T.tardis
Control/Monad/Trans/Tardis.hs view
@@ -1,6 +1,7 @@-{-# OPTIONS_GHC -Wall #-}-{-# LANGUAGE DoRec #-}+{-# OPTIONS_GHC -Wall -fno-warn-warnings-deprecations #-}+{-# LANGUAGE DoRec                           #-} + -- | The data definition of a "TardisT" -- as well as its primitive operations, -- and straightforward combinators based on the primitives.@@ -9,8 +10,7 @@ -- of what a Tardis is and how to use it. module Control.Monad.Trans.Tardis (     -- * The Tardis monad transformer-    TardisT-  , runTardisT+    TardisT (TardisT, runTardisT)   , evalTardisT   , execTardisT @@ -36,12 +36,14 @@   , getsFuture      -- * Other+  , mapTardisT   , noState   ) where  import Control.Applicative import Control.Monad.Identity import Control.Monad.Trans+import Control.Monad.Morph   -- Definition@@ -98,6 +100,12 @@ execTardis t = runIdentity . execTardisT t  +-- | A function that operates on the internal representation of a Tardis+-- can also be used on a Tardis.+mapTardisT :: (m (a, (bw, fw)) -> n (b, (bw, fw)))+           -> TardisT bw fw m a -> TardisT bw fw n b+mapTardisT f m = TardisT $ f . runTardisT m+ -- | Some Tardises never observe the 'initial' state -- of either state stream, so it is convenient -- to simply hand dummy values to such Tardises.@@ -135,6 +143,8 @@     rec (x, s') <- runTardisT (f x) s     return (x, s') +instance MFunctor (TardisT bw fw) where+  hoist = mapTardisT  -- Basics -------------------------------------------------
tardis.cabal view
@@ -1,5 +1,5 @@ name:                tardis-version:             0.3.0.0+version:             0.4.1.0 synopsis:            Bidirectional state monad transformer homepage:            https://github.com/DanBurton/tardis bug-reports:         https://github.com/DanBurton/tardis/issues@@ -16,31 +16,18 @@   state transformer, providing two state values that \"travel\"   in opposite directions.   .-  You can install this library with the @use-undecidable-instances@ flag,-  but this feature is only provided for toying around.-  If you depend on this library, or install any libraries that-  depend on this library, then you should install this library /without/-  that flag.-  .   A detailed description of what a Tardis is and how to use it   can be found in the documentation for Control.Monad.Tardis. -Flag use-undecidable-instances-  description:    Include additional instances for MonadTardis-                  that require some sketchy language extensions-  default:        False  library   exposed-modules:     Control.Monad.Tardis                      , Control.Monad.Tardis.Class                      , Control.Monad.Trans.Tardis -   build-depends:       base==4.*                      , mtl==2.*--  if flag(use-undecidable-instances)-    cpp-options: -DUSE_UNDECIDABLE_INSTANCES+                     , mmorph==1.*   source-repository head@@ -50,5 +37,4 @@ source-repository this   type:     git   location: git://github.com/DanBurton/tardis.git-  tag:      tardis-0.3.0.0-+  tag:      tardis-0.4.1.0