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