!import "base" !Local !import "list" !Local !import "io" !Local -- Cooperative scheduling with yield. -- yield returns control to the scheduler so other tasks can run. -- -- Two tasks print alternately because each yields after every line. --chatter = (name n : -- bind (putStrLn (append name " says 1")) (_ : -- bind yield (_ : -- bind (putStrLn (append name " says 2")) (_ : -- bind yield (_ : -- bind (putStrLn (append name " says 3")) (_ : -- pure n)))))) chatter = name n : bind <| putStrLn (append name " says 1") (_ : bind yield (_ : bind (putStrLn (append name " says 2")) (_ : bind yield (_ : bind (putStrLn (append name " says 3")) (_ : pure n))))) main = io <| bind (fork (chatter "A" "doneA")) (ha : bind (fork (chatter "B" "doneB")) (hb : bind yield (_ : bind (await ha) (a : bind (await hb) (b : putStrLn (append "Finished: " (append a (append " " b))))))))