package Ġme . ree zy . jet pack . http call Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . await Response Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠHttp Call < T >( call : ĠCall < T >, Ġscope : ĠCor outine Scope , Ġprivate Ġval Ġresponse : Ġ( Response < T >) Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault Ret rofit Ġby Ġlazy Ġ{ Ġdefault Ret rofit Factory () Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġdefault Ret rofit Factory : Ġ() Ġ-> ĠRet rofit ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġglobal ErrorHandler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġinit ( ret rofit Factory : Ġ() Ġ-> ĠRet rofit , ĠerrorHandler : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ret rofit Factory Ġ= Ġretrofit Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglobal ErrorHandler Ġ= ĠerrorHandler ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġservices Ġ= Ġmutable Map Of < Class <* >, ĠAny >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġget Service ( clazz : ĠClass < T >, Ġretrofit : ĠRet rofit ? Ġ= Ġnull ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( services . containsKey ( clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġservices [ clazz ] Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( ret rofit Ġ?: Ġdefault Ret rofit ). create ( clazz ). also Ġ{ Ġservices [ clazz ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcatch : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfinally : ĠMutable List < () Ġ-> ĠUnit > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġscope . launch ( context Ġ= ĠDispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ( call . await Response ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglobal ErrorHandler ?. invoke ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ?. invoke ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : Throwable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcatch ( block : Ġ( Throwable ) Ġ-> ĠUnit ): ĠHttp Call < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . catch Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinally ( block : Ġ() Ġ-> ĠUnit ): ĠHttp Call < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . finally . add ( block ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ }