tricu

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

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