X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Futils%2FIOEnv.hs;h=d01588f47b6b36f5728dd4451b1d3dba76af5acb;hp=e1dfdb400b5e03e006de839831c98129c2136537;hb=ad94d40948668032189ad22a0ad741ac1f645f50;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1 diff --git a/compiler/utils/IOEnv.hs b/compiler/utils/IOEnv.hs index e1dfdb4..d01588f 100644 --- a/compiler/utils/IOEnv.hs +++ b/compiler/utils/IOEnv.hs @@ -1,8 +1,16 @@ --- (c) The University of Glasgow 2002 +-- +-- (c) The University of Glasgow 2002-2006 -- -- The IO Monad with an environment -- +{-# OPTIONS -w #-} +-- The above warning supression flag is a temporary kludge. +-- While working on this module you are encouraged to remove it and fix +-- any warnings in the module. See +-- http://hackage.haskell.org/trac/ghc/wiki/CodingStyle#Warnings +-- for details + module IOEnv ( IOEnv, -- Instance of Monad @@ -17,7 +25,7 @@ module IOEnv ( getEnv, setEnv, updEnv, runIOEnv, unsafeInterleaveM, - tryM, tryAllM, fixM, + tryM, tryAllM, tryMostM, fixM, -- I/O operations ioToIOEnv, @@ -25,10 +33,11 @@ module IOEnv ( ) where #include "HsVersions.h" -import Panic ( try, tryUser, Exception(..) ) -import DATA_IOREF ( IORef, newIORef, readIORef, writeIORef ) -import UNSAFE_IO ( unsafeInterleaveIO ) -import FIX_IO ( fixIO ) +import Panic ( try, tryUser, tryMost, Exception(..) ) + +import Data.IORef ( IORef, newIORef, readIORef, writeIORef ) +import System.IO.Unsafe ( unsafeInterleaveIO ) +import System.IO ( fixIO ) ---------------------------------------------------------------------- @@ -45,6 +54,9 @@ instance Monad (IOEnv m) where return = returnM fail s = failM -- Ignore the string +instance Functor (IOEnv m) where + fmap f (IOEnv m) = IOEnv (\ env -> fmap f (m env)) + returnM :: a -> IOEnv env a returnM a = IOEnv (\ env -> return a) @@ -100,6 +112,9 @@ tryAllM :: IOEnv env r -> IOEnv env (Either Exception r) -- even a pattern-match failure is a programmer error tryAllM (IOEnv thing) = IOEnv (\ env -> try (thing env)) +tryMostM :: IOEnv env r -> IOEnv env (Either Exception r) +tryMostM (IOEnv thing) = IOEnv (\ env -> tryMost (thing env)) + --------------------------- unsafeInterleaveM :: IOEnv env a -> IOEnv env a unsafeInterleaveM (IOEnv m) = IOEnv (\ env -> unsafeInterleaveIO (m env))