package Ġcom . t ange m . common . services Ċ Ċ import Ġcom . t ange m . Log Ċ import Ġcom . t ange m . common . core . T ange m Sdk Error Ċ import Ġkotlinx . coroutines . delay Ċ import Ġjava . io . IOException Ċ Ċ suspend Ġfun Ġ< T > Ġretry IO ( ĊĠĠĠ Ġtimes : ĠInt Ġ= Ġ 3 , ĊĠĠĠ Ġinitial Delay : ĠLong Ġ= Ġ 1 0 0 , ĊĠĠĠ Ġmax Delay : ĠLong Ġ= Ġ 1 0 0 0 , ĊĠĠĠ Ġfactor : ĠDouble Ġ= Ġ 2 . 0 , ĊĠĠĠ Ġblock : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġvar Ġcurrent Delay Ġ= Ġinitial Delay ĊĠĠĠ Ġrepeat ( times Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . network Ġ{ Ġ" Request Ġerror : Ġ${ ex . localized Message }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdelay ( current Delay ) ĊĠĠĠĠĠĠĠ Ġcurrent Delay Ġ= Ġ( current Delay Ġ* Ġfactor ). to Long (). coerce At Most ( max Delay ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġblock () Ċ } Ċ Ċ sealed Ġclass ĠResult < out ĠT > Ġ{ ĊĠĠĠ Ġdata Ġclass ĠSuccess < out ĠT >( val Ġdata : ĠT ) Ġ: ĠResult < T >() ĊĠĠĠ Ġdata Ġclass ĠFailure ( val Ġerror : ĠThrowable ) Ġ: ĠResult < Nothing >() Ċ } Ċ Ċ fun ĠResult . Failure . to T ange m Sdk Error (): ĠT ange m Sdk Error Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this . error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠT ange m Sdk Error Ġ-> Ġthis . error ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠT ange m Sdk Error . Exception Error ( this . error ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< T > Ġperform Request ( block : Ġsuspend Ġ() Ġ-> ĠT ): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġretry IO Ġ{ Ġblock () Ġ} ĊĠĠĠĠĠĠĠ ĠResult . Success ( result ) ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . network Ġ{ Ġ" Perform Ġrequest Ġerror : Ġ${ ex . localized Message }" Ġ} ĊĠĠĠĠĠĠĠ ĠResult . Failure ( T ange m Sdk Error . Network Error (" Network Ġerror . ĠCause : Ġ${ ex . localized Message } ")) ĊĠĠĠ Ġ} Ċ }