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