packages feed

KiCS-0.8.8: src/lib/Curry/Module/Socket.hs.include

[ForType "Socket" Nothing
,ForFunction "prim_listenOn"
,ForFunction "listenOnFresh"
,ForFunction "prim_socketListen"
,ForFunction "prim_socketAccept"
,ForFunction "prim_waitForSocketAccept"
,ForFunction "prim_connectToSocket"
]

import Network
import Network.Socket 
import Control.Concurrent
import System.IO (Handle)

type C_Socket = Prim Socket

instance Read Socket where

instance Generate Socket where
  genFree  = error "no random sockets"
  maxArity = error "no narrowing on sockets"

instance ConvertCH C_Int PortID where
  toCurry (PortNumber i) = toCurry (toInteger i)
  fromCurry i = PortNumber (fromInteger (fromCurry i))

prim_listenOn :: C_Int -> Result (C_IO C_Socket)
prim_listenOn  = Curry.Module.Prelude.ioFunc1 listenOn 

listenOnFresh :: Result (C_IO (T2 C_Int C_Socket))
listenOnFresh  = Curry.Module.Prelude.ioFunc0 listenOnFreshPort

listenOnFreshPort :: IO (PortID,Socket)
listenOnFreshPort = do
  s <- listenOn (PortNumber aNY_PORT)
  p <- Network.socketPort s
  Prelude.return (p,s)


prim_socketListen :: C_Socket -> C_Int -> Result (C_IO T0)
prim_socketListen  = Curry.Module.Prelude.ioFunc2 listen

prim_socketAccept :: C_Socket -> Result (C_IO (T2 (List C_Char) C_Handle))
prim_socketAccept  = 
  ioFunc1 (\ s -> do {(h,s,_) <- Network.accept s; Prelude.return (s,One h)})

prim_waitForSocketAccept :: C_Socket -> C_Int -> Result (C_IO (C_Maybe (T2 (List C_Char) C_Handle)))
prim_waitForSocketAccept  = Curry.Module.Prelude.ioFunc2 wait

wait :: Socket -> Int -> IO (Maybe (String,IOHandle))
wait s t = do
  mv <- newEmptyMVar
  tacc <- forkIO (do {(h,s,_) <- Network.accept s; putMVar mv (Just (s,One h))})
  ttim <- forkIO (do {threadDelay (t*1000); putMVar mv Nothing})
  res <- takeMVar mv
  maybe (killThread tacc) (\_ -> killThread ttim) res
  Prelude.return res

prim_connectToSocket :: List C_Char -> C_Int -> Result (C_IO C_Handle)
prim_connectToSocket  = 
  ioFunc2 (\ s i -> do {ct <- connectTo s i; Prelude.return (One ct)})