capitalex revisou este gist 4 days ago. Ir para a revisão
1 file changed, 14 insertions, 4 deletions
coroutines.ml
| @@ -23,15 +23,25 @@ let resume co = | |||
| 23 | 23 | ||
| 24 | 24 | let yield () = perform Yield | |
| 25 | 25 | ||
| 26 | - | let task () = | |
| 26 | + | let task_a () = | |
| 27 | + | "X" |> print_endline |> yield ; | |
| 28 | + | "Y" |> print_endline |> yield ; | |
| 29 | + | "Z" |> print_endline | |
| 30 | + | ||
| 31 | + | let task_b () = | |
| 27 | 32 | "A" |> print_endline |> yield ; | |
| 33 | + | let co = start task_a in | |
| 28 | 34 | "B" |> print_endline |> yield ; | |
| 29 | - | "C" |> print_endline | |
| 35 | + | let co = resume co in | |
| 36 | + | "C" |> print_endline |> yield ; | |
| 37 | + | resume co |> ignore | |
| 30 | 38 | ||
| 31 | 39 | let () = | |
| 32 | 40 | 1 |> print_int |> print_newline ; | |
| 33 | - | let co = start task in | |
| 41 | + | let co = start task_b in | |
| 34 | 42 | 2 |> print_int |> print_newline ; | |
| 35 | 43 | let co = resume co in | |
| 36 | 44 | 3 |> print_int |> print_newline ; | |
| 37 | - | resume co |> ignore | |
| 45 | + | let co = resume co in | |
| 46 | + | 4 |> print_int |> print_newline ; | |
| 47 | + | resume co |> ignore | |
capitalex revisou este gist 4 days ago. Ir para a revisão
1 file changed, 37 insertions
coroutines.ml(arquivo criado)
| @@ -0,0 +1,37 @@ | |||
| 1 | + | open Effect | |
| 2 | + | open Effect.Deep | |
| 3 | + | ||
| 4 | + | type _ Effect.t += Yield : unit t | |
| 5 | + | ||
| 6 | + | type status = | |
| 7 | + | | Complete | |
| 8 | + | | Suspended of (unit, status) continuation | |
| 9 | + | ||
| 10 | + | let start (f : unit -> unit) : status = | |
| 11 | + | match f () with | |
| 12 | + | | () -> | |
| 13 | + | Complete | |
| 14 | + | | effect Yield, cont -> | |
| 15 | + | Suspended cont | |
| 16 | + | ||
| 17 | + | let resume co = | |
| 18 | + | match co with | |
| 19 | + | | Complete -> | |
| 20 | + | Invalid_argument "Can't resume completed quotation" |> raise | |
| 21 | + | | Suspended k -> | |
| 22 | + | continue k () | |
| 23 | + | ||
| 24 | + | let yield () = perform Yield | |
| 25 | + | ||
| 26 | + | let task () = | |
| 27 | + | "A" |> print_endline |> yield ; | |
| 28 | + | "B" |> print_endline |> yield ; | |
| 29 | + | "C" |> print_endline | |
| 30 | + | ||
| 31 | + | let () = | |
| 32 | + | 1 |> print_int |> print_newline ; | |
| 33 | + | let co = start task in | |
| 34 | + | 2 |> print_int |> print_newline ; | |
| 35 | + | let co = resume co in | |
| 36 | + | 3 |> print_int |> print_newline ; | |
| 37 | + | resume co |> ignore | |