package Ġio . temp o . internal Ċ Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ import Ġkotlinx . coroutines . delay Ċ Ċ internal Ġsuspend Ġfun Ġ< T > Ġretry IO ( ĊĠĠĠ Ġtimes : ĠInt Ġ= ĠInt . MAX _ VALUE , ĊĠĠĠ Ġinitial Delay : ĠLong Ġ= Ġ 1 0 0 L , ĊĠĠĠ Ġmax Delay : ĠLong Ġ= Ġ 2 _ 0 0 0 L , ĊĠĠĠ Ġfactor : ĠDouble Ġ= Ġ 2 . 0 , ĊĠĠĠ Ġblock : Ġsuspend Ġ() Ġ-> ĠT Ċ ): ĠT Ġ{ ĊĠĠĠ Ġrequire ( times Ġ> Ġ 0 ) ĊĠĠĠ Ġvar Ġcurrent Delay Ġ= Ġinitial Delay ĊĠĠĠ Ġrepeat ( times Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdelay ( current Delay ) ĊĠĠĠĠĠĠĠ Ġcurrent Delay Ġ= Ġ( current Delay Ġ* Ġfactor ). to Long (). coerce At Most ( max Delay ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġblock () Ġ// Ġlast Ġattempt Ċ } Ċ Ċ internal Ġfun Ġ< V Ġ: ĠAny > ĠSend Channel < V >. safe Offer ( a : ĠV ) Ġ{ ĊĠĠĠ Ġrun Catch ing Ġ{ Ġoffer ( a ) Ġ} Ċ }