Add ExceptionMonad instance for IOEnv.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Wed, 22 Jul 2015 00:05:16 +0000 (17:05 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Wed, 22 Jul 2015 20:04:04 +0000 (13:04 -0700)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
compiler/utils/IOEnv.hs

index 1ddf170..fae3b96 100644 (file)
@@ -93,6 +93,16 @@ instance Show IOEnvFailure where
 
 instance Exception IOEnvFailure
 
+instance ExceptionMonad (IOEnv a) where
+  gcatch act handle =
+      IOEnv $ \s -> unIOEnv act s `gcatch` \e -> unIOEnv (handle e) s
+  gmask f =
+      IOEnv $ \s -> gmask $ \io_restore ->
+                             let
+                                g_restore (IOEnv m) = IOEnv $ \s -> io_restore (m s)
+                             in
+                                unIOEnv (f g_restore) s
+
 instance ContainsDynFlags env => HasDynFlags (IOEnv env) where
     getDynFlags = do env <- getEnv
                      return $ extractDynFlags env