tricu

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

fb4215b238c13272389cdc445522134f5939e1a53163637c1b8abaa7d3e4cd8b.tri (1568B)


      1 !import base as B
      2 !import conversions as C
      3 !import native_math as N
      4 !import io as IO
      5 !import io_http as Transport
      6 !import http as HTTP
      7 !export main
      8 !export server
      9 -- Sequential example, not the registry's bounded concurrent admission policy.
     10 router "GET" path _ _ = IO.pure (HTTP.okResponse (B.append "Hello from " (B.append path "\n")))
     11 router _ _ _ _ = IO.pure (HTTP.errorResponse 405 "Method not allowed\n")
     12 port ["ipv4" _ value] = value
     13 port _ = 0
     14 ready listener = do IO.require
     15   address <- IO.localAddress listener
     16   output <- IO.stdout
     17   IO.require (IO.writeAll output (B.append (C.showNumber (port address)) [10])) IO.pure
     18 connection client = IO.bind (Transport.recvHeaders client) (reply : case reply of
     19   ((t t), (bytes, t)) = Transport.handle router client (HTTP.parseRequestLine bytes)
     20   (t, (431, t)) = Transport.respond client "" (HTTP.errorResponse 431 "Request Header Fields Too Large\n")
     21   _ = Transport.respond client "" (HTTP.badRequestResponse "Bad Request\n"))
     22 once listener = IO.scope (owner : IO.require (IO.acceptTCP listener owner) connection)
     23 serve 0 _ = IO.pure t
     24 serve count listener = IO.bind (once listener) (_ : serve (N.predecessor count) listener)
     25 forever listener = IO.bind (once listener) (_ : forever listener)
     26 server address count = IO.io (IO.scope (owner : do IO.require
     27   listener <- IO.listenTCP owner address 5
     28   IO.bind (ready listener) (_ : serve count listener)))
     29 main = IO.io (IO.scope (owner : do IO.require
     30   listener <- IO.listenTCP owner (IO.ipv4 [127 0 0 1] 9050) 5
     31   IO.bind (ready listener) (_ : forever listener)))