From 37ab854f9d2c1280117658bbd29919968f4f4585 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 14 Jan 2009 21:10:33 +0000 Subject: [PATCH] Move some catch definitions around to avoid an import loop As suggested by simonpj in trac #2822. --- Prelude.hs | 28 +--------------------------- Prelude.hs-boot | 7 ------- System/IO/Error.hs | 29 +++++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 36 deletions(-) delete mode 100644 Prelude.hs-boot diff --git a/Prelude.hs b/Prelude.hs index 4f01b9f..61bd27e 100644 --- a/Prelude.hs +++ b/Prelude.hs @@ -146,6 +146,7 @@ module Prelude ( #ifndef __HUGS__ import Control.Monad import System.IO +import System.IO.Error import Data.List import Data.Either import Data.Maybe @@ -164,10 +165,6 @@ import GHC.Show import GHC.Err ( error, undefined ) #endif -#ifndef __HUGS__ -import qualified Control.Exception.Base as New (catch) -#endif - #ifdef __HUGS__ import Hugs.Prelude #endif @@ -190,26 +187,3 @@ f $! x = x `seq` f x seq :: a -> b -> b seq _ y = y #endif - -#ifndef __HUGS__ --- | The 'catch' function establishes a handler that receives any 'IOError' --- raised in the action protected by 'catch'. An 'IOError' is caught by --- the most recent handler established by 'catch'. These handlers are --- not selective: all 'IOError's are caught. Exception propagation --- must be explicitly provided in a handler by re-raising any unwanted --- exceptions. For example, in --- --- > f = catch g (\e -> if IO.isEOFError e then return [] else ioError e) --- --- the function @f@ returns @[]@ when an end-of-file exception --- (cf. 'System.IO.Error.isEOFError') occurs in @g@; otherwise, the --- exception is propagated to the next outer handler. --- --- When an exception propagates outside the main program, the Haskell --- system prints the associated 'IOError' value and exits the program. --- --- Non-I\/O exceptions are not caught by this variant; to catch all --- exceptions, use 'Control.Exception.catch' from "Control.Exception". -catch :: IO a -> (IOError -> IO a) -> IO a -catch = New.catch -#endif /* !__HUGS__ */ diff --git a/Prelude.hs-boot b/Prelude.hs-boot deleted file mode 100644 index 12a9fd3..0000000 --- a/Prelude.hs-boot +++ /dev/null @@ -1,7 +0,0 @@ -{-# OPTIONS_GHC -XNoImplicitPrelude #-} - -module Prelude where - -import GHC.IOBase - -catch :: IO a -> (IOError -> IO a) -> IO a diff --git a/System/IO/Error.hs b/System/IO/Error.hs index fcbffad..372bb15 100644 --- a/System/IO/Error.hs +++ b/System/IO/Error.hs @@ -91,13 +91,15 @@ module System.IO.Error ( ) where #ifndef __HUGS__ +import qualified Control.Exception.Base as New (catch) +#endif + +#ifndef __HUGS__ import Data.Either #endif import Data.Maybe #ifdef __GLASGOW_HASKELL__ -import {-# SOURCE #-} Prelude (catch) - import GHC.Base import GHC.IOBase import Text.Show @@ -391,3 +393,26 @@ annotateIOError (UserError loc msg) msg' file' hdl' = annotateIOError (PatternError loc) msg' file' hdl' = PatternError (loc++'\n':msg') #endif + +#ifndef __HUGS__ +-- | The 'catch' function establishes a handler that receives any 'IOError' +-- raised in the action protected by 'catch'. An 'IOError' is caught by +-- the most recent handler established by 'catch'. These handlers are +-- not selective: all 'IOError's are caught. Exception propagation +-- must be explicitly provided in a handler by re-raising any unwanted +-- exceptions. For example, in +-- +-- > f = catch g (\e -> if IO.isEOFError e then return [] else ioError e) +-- +-- the function @f@ returns @[]@ when an end-of-file exception +-- (cf. 'System.IO.Error.isEOFError') occurs in @g@; otherwise, the +-- exception is propagated to the next outer handler. +-- +-- When an exception propagates outside the main program, the Haskell +-- system prints the associated 'IOError' value and exits the program. +-- +-- Non-I\/O exceptions are not caught by this variant; to catch all +-- exceptions, use 'Control.Exception.catch' from "Control.Exception". +catch :: IO a -> (IOError -> IO a) -> IO a +catch = New.catch +#endif /* !__HUGS__ */ -- 1.7.10.4