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 +3/−53
- Control/Monad/Tardis/Class.hs +13/−2
- Control/Monad/Trans/Tardis.hs +14/−4
- tardis.cabal +3/−17
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