@ file : Suppress (" EXPERIMENT AL _ FEATURE _ WARNING ", Ġ" Package Directory Mismatch ") Ċ Ċ package Ġkat as . kotlin . coroutines . steps . step 2 Ċ Ċ import Ġorg . hamcrest . Core Matchers . equalTo Ċ import Ġorg . hamcrest . Matcher Assert . assertThat Ċ import Ġkotlin . coroutines .* Ċ import Ġkotlin . coroutines . intr insics . COR OUT INE _ SUS PEN DED Ċ import Ġkotlin . coroutines . intr insics . suspend Coroutine Un intercept ed Or Return Ċ Ċ /** Ċ Ġ* ĠSend / receive Ġvalues Ġfrom Ġcoroutine Ċ Ġ*/ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġevents Ġ= ĠArrayList < String >() ĊĠĠĠ Ġfun Ġlog ( it : ĠAny ?) Ġ= Ġevents . add ( it . toString ()) ĊĊĠĠĠ Ġval Ġf Ġ= ĠY ield ing Function . create < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ( 1 ) ĊĠĠĠĠĠĠĠ Ġlog (" f =" Ġ+ Ġyield (" b ")) ĊĠĠĠĠĠĠĠ Ġlog ( 3 ) ĊĠĠĠĠĠĠĠ Ġlog (" f =" Ġ+ Ġyield (" d ")) ĊĠĠĠĠĠĠĠ Ġlog ( 5 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġlog ( 0 ) ĊĠĠĠ Ġlog (" main =" Ġ+ Ġf . resume (" a ")) Ġ// Ġstarts Ġ" f " Ġ( resume Ġargument Ġis Ġignored ) ĊĠĠĠ Ġlog ( 2 ) ĊĠĠĠ Ġlog (" main =" Ġ+ Ġf . resume (" c ")) Ġ// Ġcontinues Ġfrom Ġ" yield Ġ 3 " ĊĠĠĠ Ġlog ( 4 ) ĊĠĠĠ Ġlog (" main =" Ġ+ Ġf . resume (" e ")) Ġ// Ġcontinues Ġfrom Ġ" yield Ġ 5 " ĊĠĠĠ Ġlog ( 6 ) ĊĠĠĠ Ġlog ( f . resume (" f ")) ĊĠĠĠ Ġlog ( f . resume (" g ")) ĊĊĠĠĠ ĠassertThat ( events , ĠequalTo ( listOf ( ĊĠĠĠĠĠĠĠ Ġ" 0 ", ĊĠĠĠĠĠĠĠ Ġ" 1 ", ĊĠĠĠĠĠĠĠ Ġ" main = b ", ĊĠĠĠĠĠĠĠ Ġ" 2 ", ĊĠĠĠĠĠĠĠ Ġ" f = c ", ĊĠĠĠĠĠĠĠ Ġ" 3 ", ĊĠĠĠĠĠĠĠ Ġ" main = d ", ĊĠĠĠĠĠĠĠ Ġ" 4 ", ĊĠĠĠĠĠĠĠ Ġ" f = e ", ĊĠĠĠĠĠĠĠ Ġ" 5 ", ĊĠĠĠĠĠĠĠ Ġ" main = null ", ĊĠĠĠĠĠĠĠ Ġ" 6 ", ĊĠĠĠĠĠĠĠ Ġ" null ", ĊĠĠĠĠĠĠĠ Ġ" null " ĊĠĠĠ Ġ))) Ċ } Ċ Ċ private Ġsuspend Ġfun Ġsf ( yf : ĠY ield ing Function < String >) Ġ{ ĊĠĠĠ Ġprintln (" f =" Ġ+ Ġy f . yield (" xxx ")) Ċ } Ċ Ċ private Ġclass ĠY ield ing Function < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġstart : ĠContinu ation < Unit >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġc : ĠContinu ation < T >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġy ielded Value : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġresume ( n : ĠT ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart !!. resume ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcont Ġ= Ġc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy ielded Value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont ?. resume ( n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġy ielded Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġyield ( n : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Un intercept ed Or Return Ġ{ Ġit : ĠContinu ation < T > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy ielded Value Ġ= Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOR OUT INE _ SUS PEN DED ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġcreate ( block : Ġsuspend ĠY ield ing Function < T >. () Ġ-> ĠUnit ): ĠY ield ing Function < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠY ield ing Function < T >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . start Ġ= Ġblock . create Coroutine ( f , Ġcompletion Ġ= ĠEmpty Continuation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠEmpty Continuation : ĠContinu ation < Unit > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context ĊĠĠĠ Ġoverride Ġfun Ġresume With ( result : ĠResult < Unit >) Ġ{} Ċ } Ċ