tricu

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

forkAwait.tri (980B)


      1 !import base as B
      2 !import io as IO
      3 !import io_text as Text
      4 !export main
      5 !export worker
      6 -- Structured children return work records; the parent serializes their output.
      7 -- Task completion does not imply deterministic scheduling or atomic shared writes.
      8 worker message = IO.require IO.yield (_ : IO.pure [(B.append "working: " message) (B.append message "-result")])
      9 consume writer [_ ticket] = IO.require (IO.join ticket) (outcome : case outcome of
     10   ["completed" [message value]] = IO.require (Text.writeText writer (B.append message "\n")) (_ : IO.pure value)
     11   _ = IO.fail outcome)
     12 consume _ _ = IO.fail "Invalid spawn reply"
     13 main = IO.io (IO.scope (_ : do IO.require
     14   first <- IO.spawn 0 1 [] (_ : worker "job1")
     15   second <- IO.spawn 0 1 [] (_ : worker "job2")
     16   writer <- IO.stdout
     17   IO.bind (consume writer first) (a : IO.bind (consume writer second) (b :
     18     IO.require (Text.writeText writer (B.append "Got " (B.append a (B.append " and " (B.append b "\n"))))) IO.pure))))