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