diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2020-08-10 15:23:01 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-03-14 12:57:01 -0400 |
commit | d412cd108b2617cb3d2837994c7f39b5ba0b625d (patch) | |
tree | 9ea27e2b480c0d4a071ba3035cd8f29ff4025941 | |
parent | b15c876d9406eb42104e2eabe05053e76448e09d (diff) | |
download | haskell-d412cd108b2617cb3d2837994c7f39b5ba0b625d.tar.gz |
Write explicit IOEnv's Functor and MonadIO instances (#18202)
-rw-r--r-- | compiler/GHC/Data/IOEnv.hs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler/GHC/Data/IOEnv.hs b/compiler/GHC/Data/IOEnv.hs index 7035b82b81..90a2915eac 100644 --- a/compiler/GHC/Data/IOEnv.hs +++ b/compiler/GHC/Data/IOEnv.hs @@ -61,10 +61,16 @@ import Control.Concurrent (forkIO, killThread) newtype IOEnv env a = IOEnv' (env -> IO a) - deriving (Functor) - deriving (MonadThrow, MonadCatch, MonadMask, MonadIO) via (ReaderT env IO) + deriving (MonadThrow, MonadCatch, MonadMask) via (ReaderT env IO) -- See Note [The one-shot state monad trick] in GHC.Utils.Monad +instance Functor (IOEnv env) where + fmap f (IOEnv g) = IOEnv $ \env -> fmap f (g env) + a <$ IOEnv g = IOEnv $ \env -> g env >> pure a + +instance MonadIO (IOEnv env) where + liftIO f = IOEnv (\_ -> f) + pattern IOEnv :: forall env a. (env -> IO a) -> IOEnv env a pattern IOEnv m <- IOEnv' m where |