socket.tri (3055B)
1 !import "prelude" !Local 2 !import "io" !Local 3 4 -- Socket primitives for the IO driver. 5 -- ok value t -- pair true (pair value t) 6 -- err msg t -- pair false (pair msg t) 7 8 socket = pair 70 t 9 closeSocket = sock : pair 71 sock 10 bindSocket = sock addr port : pair 72 (pair sock (pair addr port)) 11 listen = sock backlog : pair 73 (pair sock backlog) 12 accept = sock : pair 74 sock 13 connect = sock addr port : pair 75 (pair sock (pair addr port)) 14 recv = sock maxBytes : pair 76 (pair sock maxBytes) 15 send = sock bytes : pair 77 (pair sock bytes) 16 getSocketName = sock : pair 78 sock 17 18 -- Result-aware wrappers over raw socket actions 19 onSocket = onResult socket 20 onBindSocket = sock addr port : onResult (bindSocket sock addr port) 21 onListen = sock backlog : onResult (listen sock backlog) 22 onAccept = sock : onResult (accept sock) 23 onConnect = sock addr port : onResult (connect sock addr port) 24 onRecv = sock maxBytes : onResult (recv sock maxBytes) 25 onSend = sock bytes : onResult (send sock bytes) 26 onGetSocketName = sock : onResult (getSocketName sock) 27 28 -- Result-aware wrappers that drop the 'rest' parameter 29 onSocket_ = onResult_ socket 30 onBindSocket_ = sock addr port : onResult_ (bindSocket sock addr port) 31 onListen_ = sock backlog : onResult_ (listen sock backlog) 32 onAccept_ = sock : onResult_ (accept sock) 33 onConnect_ = sock addr port : onResult_ (connect sock addr port) 34 onRecv_ = sock maxBytes : onResult_ (recv sock maxBytes) 35 onSend_ = sock bytes : onResult_ (send sock bytes) 36 onGetSocketName_ = sock : onResult_ (getSocketName sock) 37 38 -- Close a socket, ignoring errors. 39 closeSocket_ = sock : void (closeSocket sock) 40 41 -- Create a listening socket bound to an address and port. 42 -- Returns ok listenSocket or err message. 43 listenSocket = addr port backlog : 44 onOk_ socket (server : 45 onOk_ (bindSocket server addr port) (_ : 46 onOk_ (listen server backlog) (_ : 47 pure (ok server t)))) 48 49 -- Accept a connection with explicit error and ok branches. 50 -- okHandler receives (clientSocket, peerAddr). 51 withAccepted = (server errHandler okHandler : 52 onResult (accept server) 53 errHandler 54 (accepted rest : 55 okHandler (fst accepted) (snd accepted))) 56 57 -- Same as withAccepted, but handlers drop the useless 'rest' parameter. 58 withAccepted_ = (server errHandler okHandler : 59 onResult_ (accept server) 60 errHandler 61 (accepted : 62 okHandler (fst accepted) (snd accepted))) 63 64 serveOnce = (server handler : 65 withAccepted_ server 66 (err : pure t) 67 (client peer : 68 handler client peer)) 69 70 serveForkingOnce = (server handler : 71 withAccepted_ server 72 (err : pure t) 73 (client peer : 74 fork (handler client peer))) 75 76 serveForever = (server handler : 77 forever (serveForkingOnce server handler)) 78 79 connectTo = (addr port : 80 onOk socket (client rest : 81 onOk (connect client addr port) (_ rest : 82 pure (ok client rest))))