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
64 import PrelHandle ( openFileEx, IOModeEx(..),
65 hSetEcho, hGetEcho, getHandleFd
72 import IO ( hPutStr, hPutChar )
76 unsafePtrEq :: a -> a -> Bool
79 unsafePtrEq = primReallyUnsafePtrEquality
82 case reallyUnsafePtrEquality# a b of
89 newIORef :: a -> IO (IORef a)
90 readIORef :: IORef a -> IO a
91 writeIORef :: IORef a -> a -> IO ()
94 type IORef a = STRef RealWorld a
97 writeIORef = writeSTRef
99 newtype IORef a = IORef (MutableVar RealWorld a)
102 newIORef v = stToIO (newVar v) >>= \ var -> return (IORef var)
103 readIORef (IORef var) = stToIO (readVar var)
104 writeIORef (IORef var) v = stToIO (writeVar var v)
109 newIOArray :: Ix ix => (ix,ix) -> elt -> IO (IOArray ix elt)
110 boundsIOArray :: Ix ix => IOArray ix elt -> (ix, ix)
111 readIOArray :: Ix ix => IOArray ix elt -> ix -> IO elt
112 writeIOArray :: Ix ix => IOArray ix elt -> ix -> elt -> IO ()
113 freezeIOArray :: Ix ix => IOArray ix elt -> IO (Array ix elt)
114 thawIOArray :: Ix ix => Array ix elt -> IO (IOArray ix elt)
117 type IOArray ix elt = STArray RealWorld ix elt
118 newIOArray = newSTArray
119 boundsIOArray = boundsSTArray
120 readIOArray = readSTArray
121 writeIOArray = writeSTArray
122 freezeIOArray = freezeSTArray
123 thawIOArray = thawSTArray
125 newtype IOArray ix elt = IOArray (MutableArray RealWorld ix elt)
129 stToIO (newArray ixs elt) >>= \arr ->
132 boundsIOArray (IOArray arr) = boundsOfArray arr
134 readIOArray (IOArray arr) ix = stToIO (readArray arr ix)
136 writeIOArray (IOArray arr) ix elt = stToIO (writeArray arr ix elt)
138 freezeIOArray (IOArray arr) = stToIO (freezeArray arr)
141 marr <- stToIO (thawArray arr)
142 return (IOArray marr)
147 {-# NOINLINE trace #-}
148 trace :: String -> a -> a
150 trace string expr = unsafePerformIO $ do
154 trace string expr = unsafePerformIO $ do
155 fd <- getHandleFd stderr
156 hPutStr stderr string
158 _ccall_ PostTraceHook fd
164 unsafeIOToST :: IO a -> ST s a
166 unsafeIOToST = primUnsafeCoerce
168 unsafeIOToST (IO io) = ST $ \ s ->
169 case ((unsafeCoerce# io) s) of
170 (# new_s, a #) -> unsafeCoerce# (STret new_s a)
171 -- IOfail new_s e -> error ("I/O Error (unsafeIOToST): " ++ showsPrec 0 e "\n")
175 Not something you want to call normally, but useful
176 in the cases where you do want to flush stuff out of
177 the heap or make sure you've got room enough
183 performGC = _ccall_GC_ performGC