disambiguate uses of foldr for nhc98 to compile without errors
[haskell-directory.git] / System / IO.hs
index da1575c..6f0b017 100644 (file)
@@ -294,12 +294,9 @@ readFile name      =  openFile name ReadMode >>= hGetContents
 
 -- | The computation 'writeFile' @file str@ function writes the string @str@,
 -- to the file @file@.
-
-writeFile       :: FilePath -> String -> IO ()
-writeFile name str = do
-    hdl <- openFile name WriteMode
-    hPutStr hdl str
-    hClose hdl
+writeFile :: FilePath -> String -> IO ()
+writeFile f txt = bracket (openFile f WriteMode) hClose
+                         (\hdl -> hPutStr hdl txt) 
 
 -- | The computation 'appendFile' @file str@ function appends the string @str@,
 -- to the file @file@.
@@ -311,10 +308,8 @@ writeFile name str = do
 -- > main = appendFile "squares" (show [(x,x*x) | x <- [0,0.1..2]])
 
 appendFile      :: FilePath -> String -> IO ()
-appendFile name str = do
-    hdl <- openFile name AppendMode
-    hPutStr hdl str
-    hClose hdl
+appendFile f txt = bracket (openFile f AppendMode) hClose
+                          (\hdl -> hPutStr hdl txt)
 
 -- | The 'readLn' function combines 'getLine' and 'readIO'.
 
@@ -341,7 +336,7 @@ readIO s        =  case (do { (x,t) <- reads s ;
 -- 
 -- This operation may fail with:
 --
---  * 'isEOFError' if the end of file has been reached.
+--  * 'System.IO.Error.isEOFError' if the end of file has been reached.
 
 hReady         :: Handle -> IO Bool
 hReady h       =  hWaitForInput h 0
@@ -359,9 +354,9 @@ hPutStrLn hndl str = do
 --
 -- This operation may fail with:
 --
---  * 'isFullError' if the device is full; or
+--  * 'System.IO.Error.isFullError' if the device is full; or
 --
---  * 'isPermissionError' if another system resource limit would be exceeded.
+--  * 'System.IO.Error.isPermissionError' if another system resource limit would be exceeded.
 
 hPrint         :: Show a => Handle -> a -> IO ()
 hPrint hdl     =  hPutStrLn hdl . show
@@ -407,4 +402,25 @@ hSetBinaryMode _ _ = return ()
 -- the file until the entire contents of the file have been consumed.
 -- It follows that an attempt to write to a file (using 'writeFile', for
 -- example) that was earlier opened by 'readFile' will usually result in
--- failure with 'isAlreadyInUseError'.
+-- failure with 'System.IO.Error.isAlreadyInUseError'.
+
+-- -----------------------------------------------------------------------------
+-- Utils
+
+#ifdef __GLASGOW_HASKELL__
+-- Copied here to avoid recursive dependency with Control.Exception
+bracket 
+       :: IO a         -- ^ computation to run first (\"acquire resource\")
+       -> (a -> IO b)  -- ^ computation to run last (\"release resource\")
+       -> (a -> IO c)  -- ^ computation to run in-between
+       -> IO c         -- returns the value from the in-between computation
+bracket before after thing =
+  block (do
+    a <- before 
+    r <- catchException
+          (unblock (thing a))
+          (\e -> do { after a; throw e })
+    after a
+    return r
+ )
+#endif