// Ġ! LANGUAGE : Ġ- Release Cor outines Ċ // ĠIG NORE _ BACKEND : ĠJS _ IR Ċ // ĠWITH _ RUNTIME Ċ // ĠWITH _ COR OUT IN ES Ċ // ĠIG NORE _ BACKEND : ĠJS Ċ Ċ import Ġkotlin . coroutines . experimental .* Ċ import Ġkotlin . coroutines . experimental . intr insics . COR OUT INE _ SUS PEN DED Ċ Ċ fun Ġrun Custom Lambda As Coroutine ( e : ĠThrowable ? Ġ= Ġnull , Ġx : Ġ( Continuation < String >) Ġ-> ĠAny ?): ĠString Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= Ġ" fail " ĊĠĠĠ Ġvar Ġwas Intercept ed Ġ= Ġfalse ĊĠĠĠ Ġval Ġc Ġ= Ġ( x Ġas Ġsuspend Ġ() Ġ-> ĠString ). create Coroutine ( object : Ġhelpers . Continuation Adapter < String >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresume With Exception ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠCor outine Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġobject : ĠContinu ation Interceptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< R > Ġfold ( initial : ĠR , Ġoperation : Ġ( R , ĠCor outine Context . Element ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠCor outine Context . Element > Ġget ( key : ĠCor outine Context . Key < E >): ĠE ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== ĠContinu ation Interceptor . Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T > Ġintercept Continuation ( continu ation : ĠContinu ation < T >) Ġ= Ġobject Ġ: Ġhelpers . Continuation Adapter < T >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontext : ĠCor outine Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontinuation . context ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresume ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Intercept ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresume With Exception ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Intercept ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume With Exception ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġminus Key ( key : ĠCor outine Context . Key < *> ): ĠCor outine Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġplus ( context : ĠCor outine Context ): ĠCor outine Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey : ĠCor outine Context . Key < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠContinu ation Interceptor . Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresume ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġif Ġ( e Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġc . resume With Exception ( e ) ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġc . resume ( Unit ) ĊĊĠĠĠ Ġif Ġ(! was Intercept ed ) Ġreturn Ġ" was Ġnot Ġintercept ed " ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġbox (): ĠString Ġ{ ĊĠĠĠ Ġval Ġx Ġ= Ġrun Custom Lambda As Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġit . resume (" OK ") ĊĠĠĠĠĠĠĠ ĠCOR OUT INE _ SUS PEN DED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( x Ġ!= Ġ" OK ") Ġreturn Ġ" fail Ġ 1 : Ġ$ x " ĊĊĠĠĠ Ġval Ġy Ġ= Ġrun Custom Lambda As Coroutine Ġ{ ĊĠĠĠĠĠĠĠ Ġ" OK " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( y Ġ!= Ġ" OK ") Ġreturn Ġ" fail Ġ 2 : Ġ$ x " ĊĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Custom Lambda As Coroutine ( RuntimeException (" OK ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" fail Ġ 3 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġe . message !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġ" fail Ġ 3 " Ċ } Ċ