#if !defined(__GLASGOW_HASKELL__) || (__GLASGOW_HASKELL__ >= 609)
#define NEW_EXCEPTION
#endif
module Distribution.Compat.Exception (
onException, catchIO, catchExit, throwIOIO,
#if __GLASGOW_HASKELL__ <= 604
bracketOnError
#else
Exception.bracketOnError
#endif
) where
import System.Exit
import qualified Control.Exception as Exception
onException :: IO a -> IO b -> IO a
#ifdef NEW_EXCEPTION
onException = Exception.onException
#else
onException io what = io `Exception.catch` \e -> do what
Exception.throw e
#endif
throwIOIO :: Exception.IOException -> IO a
#ifdef NEW_EXCEPTION
throwIOIO = Exception.throwIO
#else
throwIOIO ioe = Exception.throwIO (Exception.IOException ioe)
#endif
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#ifdef NEW_EXCEPTION
catchIO = Exception.catch
#else
catchIO io handler = io `Exception.catch` handler'
where handler' (Exception.IOException ioe) = handler ioe
handler' e = Exception.throw e
#endif
catchExit :: IO a -> (ExitCode -> IO a) -> IO a
#ifdef NEW_EXCEPTION
catchExit = Exception.catch
#else
catchExit io handler = io `Exception.catch` handler'
where handler' (Exception.ExitException ee) = handler ee
handler' e = Exception.throw e
#endif
#if __GLASGOW_HASKELL__ <= 604
bracketOnError :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracketOnError before after thing =
Exception.block $ do
a <- before
Exception.unblock (thing a) `onException` after a
#endif