summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2020-08-10 15:23:01 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-03-14 12:57:01 -0400
commitd412cd108b2617cb3d2837994c7f39b5ba0b625d (patch)
tree9ea27e2b480c0d4a071ba3035cd8f29ff4025941
parentb15c876d9406eb42104e2eabe05053e76448e09d (diff)
downloadhaskell-d412cd108b2617cb3d2837994c7f39b5ba0b625d.tar.gz
Write explicit IOEnv's Functor and MonadIO instances (#18202)
-rw-r--r--compiler/GHC/Data/IOEnv.hs10
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