open Effect open Effect.Deep type _ Effect.t += Yield : unit t type status = | Complete | Suspended of (unit, status) continuation let start (f : unit -> unit) : status = match f () with | () -> Complete | effect Yield, cont -> Suspended cont let resume co = match co with | Complete -> Invalid_argument "Can't resume completed quotation" |> raise | Suspended k -> continue k () let yield () = perform Yield let task_a () = "X" |> print_endline |> yield ; "Y" |> print_endline |> yield ; "Z" |> print_endline let task_b () = "A" |> print_endline |> yield ; let co = start task_a in "B" |> print_endline |> yield ; let co = resume co in "C" |> print_endline |> yield ; resume co |> ignore let () = 1 |> print_int |> print_newline ; let co = start task_b in 2 |> print_int |> print_newline ; let co = resume co in 3 |> print_int |> print_newline ; let co = resume co in 4 |> print_int |> print_newline ; resume co |> ignore