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