// ĠIG NORE _ BACKEND _ FI R : ĠJVM _ IR Ċ // ĠTARGET _ BACKEND : ĠJVM Ċ // ĠWITH _ RUNTIME Ċ // ĠWITH _ COR OUT IN ES Ċ Ċ import Ġkotlin . coroutines .* Ċ import Ġkotlin . coroutines . intr insics .* Ċ Ċ var Ġresult : ĠString Ġ= Ġ"" Ċ var Ġproceed : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ Ċ fun Ġbox (): ĠString Ġ{ ĊĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠ ĠO (). foo ( 1 ) ĊĠĠĠĠĠĠĠ ĠO (). foo ( 2 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhile Ġ( proceed Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ"-- ;" ĊĠĠĠĠĠĠĠ Ġproceed !! () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( result Ġ!= Ġ" begin ( 1 ); --; end ( 1 ); begin ( 2 ); --; end ( 2 ); done ; ") Ġreturn Ġresult ; ĊĠĠĠ Ġreturn Ġ" OK " Ċ } Ċ Ċ open Ġclass ĠO Ġ{ ĊĠĠĠ Ġopen Ġsuspend Ġfun Ġfoo ( x : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ" begin ($ x );" ĊĠĠĠĠĠĠĠ Ġsleep () ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ" end ($ x );" ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġsleep (): ĠUnit Ġ= Ġsuspend Coroutine Ġ{ Ġc Ġ-> ĊĠĠĠ Ġproceed Ġ= Ġ{ Ġc . resume ( Unit ) Ġ} Ċ } Ċ Ċ fun Ġasync ( f : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġf . start Coroutine ( object Ġ: ĠContinu ation < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresume With ( x : ĠResult < Unit >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġ" done ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproceed Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext Ġ= ĠEmpty Coroutine Context ĊĠĠĠ Ġ}) Ċ } Ċ