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
67 import PrelHandle ( openFileEx, IOModeEx(..),
68 hSetEcho, hGetEcho, getHandleFd
75 import IO ( hPutStr, hPutChar )
79 unsafePtrEq :: a -> a -> Bool
82 unsafePtrEq = primReallyUnsafePtrEquality
85 case reallyUnsafePtrEquality# a b of
92 newIORef :: a -> IO (IORef a)
93 readIORef :: IORef a -> IO a
94 writeIORef :: IORef a -> a -> IO ()
97 type IORef a = STRef RealWorld a
100 writeIORef = writeSTRef
102 newtype IORef a = IORef (MutableVar RealWorld a)
105 newIORef v = stToIO (newVar v) >>= \ var -> return (IORef var)
106 readIORef (IORef var) = stToIO (readVar var)
107 writeIORef (IORef var) v = stToIO (writeVar var v)
112 newIOArray :: Ix ix => (ix,ix) -> elt -> IO (IOArray ix elt)
113 boundsIOArray :: Ix ix => IOArray ix elt -> (ix, ix)
114 readIOArray :: Ix ix => IOArray ix elt -> ix -> IO elt
115 writeIOArray :: Ix ix => IOArray ix elt -> ix -> elt -> IO ()
116 freezeIOArray :: Ix ix => IOArray ix elt -> IO (Array ix elt)
117 thawIOArray :: Ix ix => Array ix elt -> IO (IOArray ix elt)
119 unsafeFreezeIOArray :: Ix ix => IOArray ix elt -> IO (Array ix elt)
120 unsafeThawIOArray :: Ix ix => Array ix elt -> IO (IOArray ix elt)
124 type IOArray ix elt = STArray RealWorld ix elt
125 newIOArray = newSTArray
126 boundsIOArray = boundsSTArray
127 readIOArray = readSTArray
128 writeIOArray = writeSTArray
129 freezeIOArray = freezeSTArray
130 thawIOArray = thawSTArray
132 newtype IOArray ix elt = IOArray (MutableArray RealWorld ix elt)
136 stToIO (newArray ixs elt) >>= \arr ->
139 boundsIOArray (IOArray arr) = boundsOfArray arr
141 readIOArray (IOArray arr) ix = stToIO (readArray arr ix)
143 writeIOArray (IOArray arr) ix elt = stToIO (writeArray arr ix elt)
145 freezeIOArray (IOArray arr) = stToIO (freezeArray arr)
148 marr <- stToIO (thawArray arr)
149 return (IOArray marr)
151 unsafeFreezeIOArray (IOArray arr) = stToIO (unsafeFreezeArray arr)
152 unsafeThawIOArray arr = do
153 marr <- stToIO (unsafeThawArray arr)
154 return (IOArray marr)
159 {-# NOINLINE trace #-}
160 trace :: String -> a -> a
162 trace string expr = unsafePerformIO $ do
166 trace string expr = unsafePerformIO $ do
167 fd <- getHandleFd stderr
168 hPutStr stderr string
170 _ccall_ PostTraceHook fd
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