[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / interpreter / library / IO.hs
1 module IO (
2     Handle, HandlePosn,
3     IOMode(ReadMode,WriteMode,AppendMode,ReadWriteMode),
4     BufferMode(NoBuffering,LineBuffering,BlockBuffering),
5     SeekMode(AbsoluteSeek,RelativeSeek,SeekFromEnd),
6     stdin, stdout, stderr, openFile, hClose, hFileSize, hIsEOF, isEOF,
7     hSetBuffering, hGetBuffering, hFlush, hGetPosn, hSetPosn, hSeek, 
8     hIsOpen, hIsClosed, hIsReadable, hIsWritable, hIsSeekable, hReady, 
9     hGetChar, hLookAhead, hGetContents, hPutChar, hPutStr, hPrint,
10     isAlreadyExistsError, isAlreadyInUseError, isFullError, isEOFError,
11     isIllegalOperation, isPermissionError, isUserError, 
12     ioeGetHandle, ioeGetFileName ) where
13 import Ix
14
15 data Handle = ...
16 instance Eq Handle where ...
17 data HandlePosn = ...
18 instance Eq HandlePosn where ...
19
20 data IOMode      =  ReadMode | WriteMode | AppendMode | ReadWriteMode
21                     deriving (Eq, Ord, Ix, Enum, Read, Show)
22 data BufferMode  =  NoBuffering | LineBuffering | BlockBuffering (Maybe Int)
23                     deriving (Eq, Ord, Read, Show)
24 data SeekMode    =  AbsoluteSeek | RelativeSeek | SeekFromEnd
25                     deriving (Eq, Ord, Ix, Enum, Read, Show)
26
27 stdin, stdout, stderr :: Handle
28 openFile              :: FilePath -> IOMode -> IO Handle
29 hClose                :: Handle -> IO () 
30 hFileSize             :: Handle -> IO Integer
31 hIsEOF                :: Handle -> IO Bool
32 isEOF                 :: IO Bool
33 isEOF                 =  hIsEOF stdin
34 hSetBuffering         :: Handle  -> BufferMode -> IO ()
35 hGetBuffering         :: Handle  -> IO BufferMode
36 hFlush                :: Handle -> IO () 
37 hGetPosn              :: Handle -> IO HandlePosn
38 hSetPosn              :: HandlePosn -> IO () 
39 hSeek                 :: Handle -> SeekMode -> Integer -> IO () 
40 hIsOpen               :: Handle -> IO Bool
41 hIsClosed             :: Handle -> IO Bool
42 hIsReadable           :: Handle -> IO Bool
43 hIsWritable           :: Handle -> IO Bool
44 hIsSeekable           :: Handle -> IO Bool
45 hReady                :: Handle -> IO Bool 
46
47 try            :: IO a -> IO (Either IOError a)
48 try f          =  catch (do r <- f
49                             return (Right r))
50                         (return . Left)
51
52 bracket        :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
53 bracket before after m = do
54         x  <- before
55         rs <- try (m x)
56         after x
57         case rs of
58            Right r -> return r
59            Left  e -> fail e
60
61 -- variant of the above where middle computation doesn't want x
62 bracket_        :: IO a -> (a -> IO b) -> IO c -> IO c
63 bracket_ before after m = do
64          x  <- before
65          rs <- try m
66          after x
67          case rs of
68             Right r -> return r
69             Left  e -> fail e