2 % (c) The AQUA Project, Glasgow University, 1994-1996
4 \section[IOExts]{Module @IOExts@}
6 @IOExts@ provides useful functionality that fall outside the
7 standard Haskell IO interface. Expect the contents of IOExts
8 to be the same for Hugs and GHC (same goes for any other
9 Hugs/GHC extension libraries, unless a function/type is
10 explicitly flagged as being implementation specific
14 {-# OPTIONS -fno-implicit-prelude #-}
21 , IORef -- instance of: Eq
26 , IOArray -- instance of: Eq
65 import PrelHandle ( openFileEx, IOModeEx(..),
66 hSetEcho, hGetEcho, getHandleFd
73 import IO ( hPutStr, hPutChar )
77 unsafePtrEq :: a -> a -> Bool
80 unsafePtrEq = primReallyUnsafePtrEquality
83 case reallyUnsafePtrEquality# a b of
90 newIORef :: a -> IO (IORef a)
91 readIORef :: IORef a -> IO a
92 writeIORef :: IORef a -> a -> IO ()
95 type IORef a = STRef RealWorld a
98 writeIORef = writeSTRef
100 newtype IORef a = IORef (MutableVar RealWorld a)
103 newIORef v = stToIO (newVar v) >>= \ var -> return (IORef var)
104 readIORef (IORef var) = stToIO (readVar var)
105 writeIORef (IORef var) v = stToIO (writeVar var v)
110 newIOArray :: Ix ix => (ix,ix) -> elt -> IO (IOArray ix elt)
111 boundsIOArray :: Ix ix => IOArray ix elt -> (ix, ix)
112 readIOArray :: Ix ix => IOArray ix elt -> ix -> IO elt
113 writeIOArray :: Ix ix => IOArray ix elt -> ix -> elt -> IO ()
114 freezeIOArray :: Ix ix => IOArray ix elt -> IO (Array ix elt)
115 thawIOArray :: Ix ix => Array ix elt -> IO (IOArray ix elt)
118 type IOArray ix elt = STArray RealWorld ix elt
119 newIOArray = newSTArray
120 boundsIOArray = boundsSTArray
121 readIOArray = readSTArray
122 writeIOArray = writeSTArray
123 freezeIOArray = freezeSTArray
124 thawIOArray = thawSTArray
126 newtype IOArray ix elt = IOArray (MutableArray RealWorld ix elt)
130 stToIO (newArray ixs elt) >>= \arr ->
133 boundsIOArray (IOArray arr) = boundsOfArray arr
135 readIOArray (IOArray arr) ix = stToIO (readArray arr ix)
137 writeIOArray (IOArray arr) ix elt = stToIO (writeArray arr ix elt)
139 freezeIOArray (IOArray arr) = stToIO (freezeArray arr)
142 marr <- stToIO (thawArray arr)
143 return (IOArray marr)
148 {-# NOINLINE trace #-}
149 trace :: String -> a -> a
151 trace string expr = unsafePerformIO $ do
155 trace string expr = unsafePerformIO $ do
156 fd <- getHandleFd stderr
157 hPutStr stderr string
159 _ccall_ PostTraceHook fd
165 unsafeIOToST :: IO a -> ST s a
167 unsafeIOToST = primUnsafeCoerce
169 unsafeIOToST (IO io) = ST $ \ s ->
170 case ((unsafeCoerce# io) s) of
171 (# new_s, a #) -> unsafeCoerce# (STret new_s a)
172 -- IOfail new_s e -> error ("I/O Error (unsafeIOToST): " ++ showsPrec 0 e "\n")
176 Not something you want to call normally, but useful
177 in the cases where you do want to flush stuff out of
178 the heap or make sure you've got room enough
184 performGC = _ccall_GC_ performGC