add withFile and withBinaryFile (#966)
authorRoss Paterson <ross@soi.city.ac.uk>
Tue, 7 Nov 2006 13:45:10 +0000 (13:45 +0000)
committerRoss Paterson <ross@soi.city.ac.uk>
Tue, 7 Nov 2006 13:45:10 +0000 (13:45 +0000)
System/IO.hs

index 6f0b017..a7552f5 100644 (file)
@@ -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