From: Ross Paterson Date: Tue, 7 Nov 2006 13:45:10 +0000 (+0000) Subject: add withFile and withBinaryFile (#966) X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=43b264ae52debea04f4cd09aa5c5f5135b3a864a;p=ghc-base.git add withFile and withBinaryFile (#966) --- diff --git a/System/IO.hs b/System/IO.hs index 6f0b017..a7552f5 100644 --- a/System/IO.hs +++ b/System/IO.hs @@ -36,6 +36,7 @@ module System.IO ( -- ** Opening files + withFile, openFile, -- :: FilePath -> IOMode -> IO Handle IOMode(ReadMode,WriteMode,AppendMode,ReadWriteMode), @@ -144,6 +145,7 @@ module System.IO ( -- * Binary input and output + withBinaryFile, openBinaryFile, -- :: FilePath -> IOMode -> IO Handle hSetBinaryMode, -- :: Handle -> Bool -> IO () #if !defined(__NHC__) @@ -179,6 +181,7 @@ import Hugs.IO import Hugs.IOExts import Hugs.IORef import Hugs.Prelude ( throw, Exception(NonTermination) ) +import Control.Exception ( bracket ) import System.IO.Unsafe ( unsafeInterleaveIO ) #endif @@ -214,6 +217,7 @@ import IO , hIsOpen, hIsClosed -- :: Handle -> IO Bool , hIsReadable, hIsWritable -- :: Handle -> IO Bool , hIsSeekable -- :: Handle -> IO Bool + , bracket , IO () , FilePath -- :: String @@ -362,6 +366,20 @@ hPrint :: Show a => Handle -> a -> IO () hPrint hdl = hPutStrLn hdl . show #endif /* !__NHC__ */ +-- | @'withFile' name mode act@ opens a file using 'openFile' and passes +-- the resulting handle to the computation @act@. The handle will be +-- closed on exit from 'withFile', whether by normal termination or by +-- raising an exception. +withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r +withFile name mode = bracket (openFile name mode) hClose + +-- | @'withBinaryFile' name mode act@ opens a file using 'openBinaryFile' +-- and passes the resulting handle to the computation @act@. The handle +-- will be closed on exit from 'withBinaryFile', whether by normal +-- termination or by raising an exception. +withBinaryFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r +withBinaryFile name mode = bracket (openBinaryFile name mode) hClose + -- --------------------------------------------------------------------------- -- fixIO