%
% (c) The AQUA Project, Glasgow University, 1994-1996
%
-
\section[IOExts]{Module @IOExts@}
+@IOExts@ provides useful functionality that fall outside the
+standard Haskell IO interface. Expect the contents of IOExts
+to be the same for Hugs and GHC (same goes for any other
+Hugs/GHC extension libraries, unless a function/type is
+explicitly flagged as being implementation specific
+extension.)
+
\begin{code}
{-# OPTIONS -fno-implicit-prelude #-}
, unsafePerformIO
, unsafeInterleaveIO
- , IORef
- -- instance Eq (IORef a)
+ , IORef -- instance of: Eq
, newIORef
, readIORef
, writeIORef
- , IOArray
- -- instance Eq (IOArray ix a)
+ , IOArray -- instance of: Eq
, newIOArray
, boundsIOArray
, readIOArray
, hSetEcho
, hGetEcho
+ , hIsTerminalDevice
+ , hConnectTo
, trace
, performGC
, reallyUnsafePtrEq
+ , unsafeIOToST
+
) where
+
\end{code}
\begin{code}
import PrelBase
import PrelIOBase
import PrelHandle ( openFileEx, IOModeEx(..),
- hSetEcho, hGetEcho
+ hSetEcho, hGetEcho, getHandleFd
)
import PrelST
import PrelArr
import PrelGHC
import Ix
+import IO
+import PrelHandle
+import PrelErr
+reallyUnsafePtrEq :: a -> a -> Bool
reallyUnsafePtrEq a b =
case reallyUnsafePtrEquality# a b of
0# -> False
freezeIOArray (IOArray arr) = stToIO (freezeArray arr)
\end{code}
+\begin{code}
+{-# NOINLINE trace #-}
+trace :: String -> a -> a
+trace string expr = unsafePerformIO $ do
+ fd <- getHandleFd stderr
+ hPutStrLn stderr string
+ _ccall_ PostTraceHook fd
+ return expr
+
+\end{code}
+
+\begin{code}
+unsafeIOToST :: IO a -> ST s a
+unsafeIOToST (IO io) = ST $ \ s ->
+ case ((unsafeCoerce# io) s) of
+ IOok new_s a -> unsafeCoerce# (STret new_s a)
+ IOfail new_s e -> error ("I/O Error (unsafeIOToST): " ++ showsPrec 0 e "\n")
+\end{code}
+
+Not something you want to call normally, but useful
+in the cases where you do want to flush stuff out of
+the heap or make sure you've got room enough
+
+\begin{code}
+performGC :: IO ()
+performGC = _ccall_GC_ StgPerformGarbageCollection
+\end{code}