最後活躍 4 days ago

修訂 58cfdfe5d3fe6e3e062b0f3b01ce06715d3185ad

coroutines.ml 原始檔案 Playground
1open Effect
2open Effect.Deep
3
4type _ Effect.t += Yield : unit t
5
6type status =
7 | Complete
8 | Suspended of (unit, status) continuation
9
10let start (f : unit -> unit) : status =
11 match f () with
12 | () ->
13 Complete
14 | effect Yield, cont ->
15 Suspended cont
16
17let resume co =
18 match co with
19 | Complete ->
20 Invalid_argument "Can't resume completed quotation" |> raise
21 | Suspended k ->
22 continue k ()
23
24let yield () = perform Yield
25
26let task_a () =
27 "X" |> print_endline |> yield ;
28 "Y" |> print_endline |> yield ;
29 "Z" |> print_endline
30
31let task_b () =
32 "A" |> print_endline |> yield ;
33 let co = start task_a in
34 "B" |> print_endline |> yield ;
35 let co = resume co in
36 "C" |> print_endline |> yield ;
37 resume co |> ignore
38
39let () =
40 1 |> print_int |> print_newline ;
41 let co = start task_b in
42 2 |> print_int |> print_newline ;
43 let co = resume co in
44 3 |> print_int |> print_newline ;
45 let co = resume co in
46 4 |> print_int |> print_newline ;
47 resume co |> ignore
48