echoServer.tri (1138B)
1 !import base as B 2 !import conversions as C 3 !import native_math as N 4 !import io 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)))