[project @ 1998-08-14 13:01:44 by sof]
authorsof <unknown>
Fri, 14 Aug 1998 13:01:45 +0000 (13:01 +0000)
committersof <unknown>
Fri, 14 Aug 1998 13:01:45 +0000 (13:01 +0000)
New functions: unsafeIOToST, hConnectTo

ghc/lib/exts/GlaExts.lhs
ghc/lib/exts/IOExts.lhs

index ada0f05..a95a6eb 100644 (file)
@@ -68,7 +68,7 @@ import PrelIOBase
 import ByteArray
 import MutableArray
 import Monad
-import Foreign
+import PrelCCall   ( Word(..) )
 
 type PrimIO a = IO a
 primIOToIO io = io
index d74c21a..8b09456 100644 (file)
@@ -1,9 +1,15 @@
 %
 % (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 #-}
 
@@ -12,14 +18,12 @@ module IOExts
         , 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
@@ -31,25 +35,34 @@ module IOExts
 
         , 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
@@ -93,3 +106,30 @@ writeIOArray (IOArray arr) ix elt = stToIO (writeArray arr ix elt)
 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}