tricu

A lazy functional language based on Tree Calculus
Log | Files | Refs | README | LICENSE

834a2c8b9c9007364036bb22159ca0c5050c1536e87c4c40bf5573efee863e30.tri (1141B)


      1 !import base as B
      2 !import conversions as C
      3 !import native_math as N
      4 !import io_v2 as IO
      5 !export main
      6 !export server
      7 -- A deliberately sequential, bounded-stream echo demonstration. A stalled peer
      8 -- holds the single connection slot; there is no idle timeout or availability SLA.
      9 port ["ipv4" _ value] = value
     10 port _ = 0
     11 ready listener = do IO.require
     12   address <- IO.localAddress listener
     13   output <- IO.stdout
     14   IO.require (IO.writeAll output (B.append (C.showNumber (port address)) [10])) IO.pure
     15 once listener = IO.scope (owner : IO.require (IO.acceptTCP listener owner)
     16   (client : IO.require (IO.copyStream client client) (_ : IO.pure t)))
     17 serve 0 _ = IO.pure t
     18 serve count listener = IO.bind (once listener) (_ : serve (N.predecessor count) listener)
     19 forever listener = IO.bind (once listener) (_ : forever listener)
     20 server address count = IO.io (IO.scope (owner : do IO.require
     21   listener <- IO.listenTCP owner address 5
     22   IO.bind (ready listener) (_ : serve count listener)))
     23 main = IO.io (IO.scope (owner : do IO.require
     24   listener <- IO.listenTCP owner (IO.ipv4 [127 0 0 1] 0) 5
     25   IO.bind (ready listener) (_ : forever listener)))