tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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))))