package ĠAsync Adapter Ċ Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . run Blocking Ċ Ċ // ĠDeferred - return ing Ġfunction Ġcallback - last Ġ/ Ġerror - first Ċ fun Ġ< T , ĠK > Ġcallback ify ( fn : Ġ( T ) Ġ-> ĠDeferred < K >): Ġsuspend Ġ( T , ĠS usp back < K >) Ġ-> ĠUnit Ġ= Ġ{ Ġargs , Ġcb Ġ-> ĊĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġcb ( null , Ġfn ( args ). await ()) ĊĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠ Ġcb ( it , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠUsage Ċ private Ġfun Ġtwice Async ( x : ĠInt ) Ġ= ĠGlobal Scope . async Ġ{ Ġx Ġ* Ġ 2 Ġ} Ċ private Ġval Ġtwice Callback Ġ= Ġcallback ify (:: tw ice Async ) Ċ Ċ private Ġfun Ġhalf Async ( x : ĠInt ) Ġ= ĠGlobal Scope . async Ġ{ Ġx Ġ/ Ġ 2 Ġ} Ċ private Ġval Ġhalf Callback Ġ= Ġcallback ify (:: half Async ) Ċ Ċ private Ġfun Ġmain () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġval Ġa Ġ= Ġtwice Async ( 1 0 0 ). await () ĊĠĠĠ Ġval Ġb Ġ= Ġhalf Async ( a ). await () ĊĠĠĠ Ġprintln (" async : Ġ$ b ") ĊĊĠĠĠ Ġtwice Callback ( 1 0 0 ) Ġ{ Ġ_, Ġvalue Ġ-> ĊĠĠĠĠĠĠĠ Ġhalf Callback ( value !! ) Ġ{ Ġ_, Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" callback : Ġ$ result ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ