tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

yield.tri (897B)


      1 !import "prelude" !Local
      2 !import "io"      !Local
      3 
      4 -- Cooperative scheduling with yield.
      5 --   yield returns control to the scheduler so other tasks can run.
      6 --
      7 --   Two tasks print alternately because each yields after every line.
      8 
      9 --chatter = (name n :
     10 --  bind (putStrLn (append name " says 1")) (_ :
     11 --  bind yield (_ :
     12 --  bind (putStrLn (append name " says 2")) (_ :
     13 --  bind yield (_ :
     14 --  bind (putStrLn (append name " says 3")) (_ :
     15 --  pure n))))))
     16 
     17 chatter = name n : bind <|
     18   putStrLn (append name " says 1") (_ :
     19   bind yield (_ :
     20   bind (putStrLn (append name " says 2")) (_ :
     21   bind yield (_ :
     22   bind (putStrLn (append name " says 3")) (_ :
     23   pure n)))))
     24 
     25 
     26 main = io <|
     27   bind (fork (chatter "A" "doneA")) (ha :
     28   bind (fork (chatter "B" "doneB")) (hb :
     29   bind yield (_ :
     30   bind (await ha) (a :
     31   bind (await hb) (b :
     32   putStrLn (append "Finished: " (append a (append " " b))))))))