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" |> print_endline |> yield ; "B" |> print_endline |> yield ; "C" |> print_endline let () = 1 |> print_int |> print_newline ; let co = start task in 2 |> print_int |> print_newline ; let co = resume co in 3 |> print_int |> print_newline ; resume co |> ignore