diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2015-12-08 11:11:11 +0100 |
---|---|---|
committer | Herbert Valerio Riedel <hvr@gnu.org> | 2015-12-08 11:15:49 +0100 |
commit | fd3b845c01aa26b6e5cd12c00af59e5468e21b1b (patch) | |
tree | a6048cc545e9db073a1213aaa03ad02c8ef66531 /compiler/main/DynFlags.hs | |
parent | 9f4ca5afaccc8a397d8ee91b5423a9c2fcd151ce (diff) | |
download | haskell-fd3b845c01aa26b6e5cd12c00af59e5468e21b1b.tar.gz |
Make HasDynFlags more transformers friendly
Ideally, we'd have the more general
instance (MonadTrans t, Monad m, HasDynFlags m) => HasDynFlags (t m) where
getDynFlags = lift getDynFlags
definition. However, that one would overlap with the `HasDynFlags (GhcT m)`
instance. Instead we define instances for a couple of common Monad
transformers explicitly in order to avoid nasty overlapping instances.
This is a preparatory refactoring for #10874
Reviewed By: austin
Differential Revision: https://phabricator.haskell.org/D1581
Diffstat (limited to 'compiler/main/DynFlags.hs')
-rw-r--r-- | compiler/main/DynFlags.hs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 3d99a1a5c0..c492a01332 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE FlexibleInstances #-} ------------------------------------------------------------------------------- -- @@ -176,6 +177,13 @@ import System.IO.Unsafe ( unsafePerformIO ) import Data.IORef import Control.Arrow ((&&&)) import Control.Monad +import Control.Monad.Trans.Class +import Control.Monad.Trans.Writer +import Control.Monad.Trans.Reader +import qualified Control.Monad.Trans.Maybe as CMT +#if MIN_VERSION_transformers(4,0,0) +import Control.Monad.Trans.Except +#endif import Control.Exception (throwIO) import Data.Bits @@ -186,6 +194,7 @@ import Data.Map (Map) import qualified Data.Map as Map import Data.Set (Set) import qualified Data.Set as Set +import Data.Monoid (Monoid) import Data.Word import System.FilePath import System.Directory @@ -912,6 +921,32 @@ data DynFlags = DynFlags { class HasDynFlags m where getDynFlags :: m DynFlags +{- It would be desirable to have the more generalised + + instance (MonadTrans t, Monad m, HasDynFlags m) => HasDynFlags (t m) where + getDynFlags = lift getDynFlags + +instance definition. However, that definition would overlap with the +`HasDynFlags (GhcT m)` instance. Instead we define instances for a +couple of common Monad transformers explicitly. -} + +instance (Monoid a, Monad m, HasDynFlags m) => HasDynFlags (WriterT a m) where + getDynFlags = lift getDynFlags + +instance (Monad m, HasDynFlags m) => HasDynFlags (ReaderT a m) where + getDynFlags = lift getDynFlags + +instance (Monad m, HasDynFlags m) => HasDynFlags (MaybeT m) where + getDynFlags = liftMaybeT getDynFlags + +instance (Monad m, HasDynFlags m) => HasDynFlags (CMT.MaybeT m) where + getDynFlags = lift getDynFlags + +#if MIN_VERSION_transformers(4,0,0) +instance (Monad m, HasDynFlags m) => HasDynFlags (ExceptT e m) where + getDynFlags = lift getDynFlags +#endif + class ContainsDynFlags t where extractDynFlags :: t -> DynFlags replaceDynFlags :: t -> DynFlags -> t |