Commit 50a3ac89 authored by sof's avatar sof
Browse files

[project @ 1998-08-14 13:01:44 by sof]

New functions: unsafeIOToST, hConnectTo
parent 5de97ffe
......@@ -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
......
%
% (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}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment