[project @ 2001-06-28 14:15:04 by simonmar]
[packages/old-time.git] / System / IO.hs
1 {-# OPTIONS -fno-implicit-prelude #-}
2 -----------------------------------------------------------------------------
3 --
4 -- Module : System.IO
5 -- Copyright : (c) The University of Glasgow 2001
6 -- License : BSD-style (see the file libraries/core/LICENSE)
7 --
8 -- Maintainer : libraries@haskell.org
9 -- Stability : provisional
10 -- Portability : portable
11 --
12 -- $Id: IO.hs,v 1.1 2001/06/28 14:15:04 simonmar Exp $
13 --
14 -- The standard IO library.
15 --
16 -----------------------------------------------------------------------------
17
18 module System.IO (
19 Handle, -- abstract, instance of: Eq, Show.
20 HandlePosn(..), -- abstract, instance of: Eq, Show.
21
22 IOMode(ReadMode,WriteMode,AppendMode,ReadWriteMode),
23 BufferMode(NoBuffering,LineBuffering,BlockBuffering),
24 SeekMode(AbsoluteSeek,RelativeSeek,SeekFromEnd),
25
26 stdin, stdout, stderr, -- :: Handle
27
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
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 hWaitForInput, -- :: Handle -> Int -> IO Bool
41 hReady, -- :: Handle -> IO Bool
42 hGetChar, -- :: Handle -> IO Char
43 hGetLine, -- :: Handle -> IO [Char]
44 hLookAhead, -- :: Handle -> IO Char
45 hGetContents, -- :: Handle -> IO [Char]
46 hPutChar, -- :: Handle -> Char -> IO ()
47 hPutStr, -- :: Handle -> [Char] -> IO ()
48 hPutStrLn, -- :: Handle -> [Char] -> IO ()
49 hPrint, -- :: Show a => Handle -> a -> IO ()
50 hIsOpen, hIsClosed, -- :: Handle -> IO Bool
51 hIsReadable, hIsWritable, -- :: Handle -> IO Bool
52 hIsSeekable, -- :: Handle -> IO Bool
53
54 isAlreadyExistsError, isDoesNotExistError, -- :: IOError -> Bool
55 isAlreadyInUseError, isFullError,
56 isEOFError, isIllegalOperation,
57 isPermissionError, isUserError,
58
59 ioeGetErrorString, -- :: IOError -> String
60 ioeGetHandle, -- :: IOError -> Maybe Handle
61 ioeGetFileName, -- :: IOError -> Maybe FilePath
62
63 try, -- :: IO a -> IO (Either IOError a)
64 bracket, -- :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
65 bracket_, -- :: IO a -> (a -> IO b) -> IO c -> IO c
66
67 -- Non-standard extension (but will hopefully become standard with 1.5) is
68 -- to export the Prelude io functions via IO (in addition to exporting them
69 -- from the prelude...for now.)
70 IO,
71 FilePath, -- :: String
72 IOError,
73 ioError, -- :: IOError -> IO a
74 userError, -- :: String -> IOError
75 catch, -- :: IO a -> (IOError -> IO a) -> IO a
76 interact, -- :: (String -> String) -> IO ()
77
78 putChar, -- :: Char -> IO ()
79 putStr, -- :: String -> IO ()
80 putStrLn, -- :: String -> IO ()
81 print, -- :: Show a => a -> IO ()
82 getChar, -- :: IO Char
83 getLine, -- :: IO String
84 getContents, -- :: IO String
85 readFile, -- :: FilePath -> IO String
86 writeFile, -- :: FilePath -> String -> IO ()
87 appendFile, -- :: FilePath -> String -> IO ()
88 readIO, -- :: Read a => String -> IO a
89 readLn, -- :: Read a => IO a
90
91 hPutBuf, -- :: Handle -> Ptr a -> Int -> IO ()
92 hGetBuf, -- :: Handle -> Ptr a -> Int -> IO Int
93
94 fixIO, -- :: (a -> IO a) -> IO a
95 ) where
96
97 #ifdef __GLASGOW_HASKELL__
98 import GHC.Base
99 import GHC.IOBase -- Together these four Prelude modules define
100 import GHC.Handle -- all the stuff exported by IO for the GHC version
101 import GHC.IO
102 import GHC.ST ( fixST )
103 import GHC.Exception
104 import GHC.Num
105 import GHC.Read
106 import GHC.Show
107 #endif
108
109 import Data.Dynamic
110
111 -- -----------------------------------------------------------------------------
112 -- Typeable instance for Handle
113
114 #include "Dynamic.h"
115 INSTANCE_TYPEABLE0(Handle,handleTc,"Handle")
116
117 -- -----------------------------------------------------------------------------
118 -- Standard IO
119
120 putChar :: Char -> IO ()
121 putChar c = hPutChar stdout c
122
123 putStr :: String -> IO ()
124 putStr s = hPutStr stdout s
125
126 putStrLn :: String -> IO ()
127 putStrLn s = do putStr s
128 putChar '\n'
129
130 print :: Show a => a -> IO ()
131 print x = putStrLn (show x)
132
133 getChar :: IO Char
134 getChar = hGetChar stdin
135
136 getLine :: IO String
137 getLine = hGetLine stdin
138
139 getContents :: IO String
140 getContents = hGetContents stdin
141
142 interact :: (String -> String) -> IO ()
143 interact f = do s <- getContents
144 putStr (f s)
145
146 readFile :: FilePath -> IO String
147 readFile name = openFile name ReadMode >>= hGetContents
148
149 writeFile :: FilePath -> String -> IO ()
150 writeFile name str = do
151 hdl <- openFile name WriteMode
152 hPutStr hdl str
153 hClose hdl
154
155 appendFile :: FilePath -> String -> IO ()
156 appendFile name str = do
157 hdl <- openFile name AppendMode
158 hPutStr hdl str
159 hClose hdl
160
161 readLn :: Read a => IO a
162 readLn = do l <- getLine
163 r <- readIO l
164 return r
165
166 -- raises an exception instead of an error
167 readIO :: Read a => String -> IO a
168 readIO s = case (do { (x,t) <- reads s ;
169 ("","") <- lex t ;
170 return x }) of
171 [x] -> return x
172 [] -> ioError (userError "Prelude.readIO: no parse")
173 _ -> ioError (userError "Prelude.readIO: ambiguous parse")
174
175 hReady :: Handle -> IO Bool
176 hReady h = hWaitForInput h 0
177
178 hPutStrLn :: Handle -> String -> IO ()
179 hPutStrLn hndl str = do
180 hPutStr hndl str
181 hPutChar hndl '\n'
182
183 hPrint :: Show a => Handle -> a -> IO ()
184 hPrint hdl = hPutStrLn hdl . show
185
186 -- ---------------------------------------------------------------------------
187 -- fixIO
188
189 #ifdef __GLASGOW_HASKELL__
190 fixIO :: (a -> IO a) -> IO a
191 fixIO m = stToIO (fixST (ioToST . m))
192 #endif