KiCS-0.8.8: src/lib/Curry/Module/IOExts.hs.include
[ForType "IORef" Nothing
,ForFunction "prim_execCmd"
,ForFunction "choiceStreamOrMsgs"
,ForFunction "prim_setAssoc"
,ForFunction "prim_getAssoc"
,ForFunction "newIORef"
,ForFunction "prim_readIORef"
,ForFunction "prim_writeIORef"
]
import Data.IORef
import qualified Data.IORef as Ref
import System.Process
import Network
import qualified Network.Socket as SO
import System.IO.Unsafe
import Control.Concurrent
import System.IO
import Curry.Module.IO
import qualified Curry.Module.Global
instance Eq (List C_Char) where
List == List = True
List == (_ :< _) = False
(_ :< _) == List = False
(C_Char c :< xs) == (C_Char c' :< ys) = c Prelude.== c' && xs Prelude.== ys
type Assocs = [(C_String,C_String)]
assocs :: Ref.IORef Assocs
assocs = unsafePerformIO (Ref.newIORef [])
getAssocs :: IO Assocs
getAssocs = Ref.readIORef assocs
setAssocs :: Assocs -> IO ()
setAssocs as = Ref.writeIORef assocs as
prim_execCmd :: List C_Char -> Result (C_IO (T3 C_Handle C_Handle C_Handle))
prim_execCmd = ioFunc1 (\s -> do
(h1,h2,h3,_) <- runInteractiveCommand s
Prelude.return (One h1,One h2,One h3))
prim_connectToCmd :: List C_Char -> Result (C_IO C_Handle)
prim_connectToCmd = ioFunc1 (\s -> do
(hin,hout,herr,_) <- runInteractiveCommand s
forkIO (forwardError herr)
Prelude.return (Two hout hin))
forwardError :: Handle -> IO ()
forwardError h = do
eof <- hIsEOF h
if eof then Prelude.return ()
else do
line <- hGetLine h
hPutStrLn System.IO.stderr line
forwardError h
prim_setAssoc :: List C_Char -> List C_Char -> Result (C_IO T0)
prim_setAssoc key val = ioFunc0 (do
as <- getAssocs
setAssocs ((key,val):as))
prim_getAssoc :: List C_Char -> Result (C_IO (C_Maybe (List C_Char)))
prim_getAssoc key _ = C_IO (\_ -> do
as <- getAssocs
Prelude.return (IOVal (maybe C_Nothing C_Just (lookup key as))))
type C_IORef a = Curry.Module.Global.C_IORef a
newIORef :: Curry t0 => t0 -> Result (C_IO (C_IORef t0))
newIORef = Curry.Module.Global.newIORef
prim_readIORef :: Curry t0 => C_IORef t0 -> Result (C_IO t0)
prim_readIORef = Curry.Module.Global.prim_readIORef
prim_writeIORef :: Curry t0 => C_IORef t0 -> t0 -> Result (C_IO T0)
prim_writeIORef = Curry.Module.Global.prim_writeIORef