import Ġio . reactivex . rx java 3 . annotations . NonNull Ċ import Ġio . reactivex . rx java 3 . core .* Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġio . reactivex . rx java 3 . subjects . Publish Subject Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . math . min Ċ Ċ fun Ġ< T > ĠObservable < T >. retry With ( transformation : Ġ( Throwable ) Ġ-> ĠSingle < *> ): ĠObservable < T > Ġ= Ċ ĉ retry When Ġ{ Ġerrors Ġ-> Ġerrors . flatMap Single ( transformation ) Ġ} Ċ Ċ fun Ġ< T > ĠSingle < T >. retry With ( transformation : Ġ( Throwable ) Ġ-> ĠSingle < *> ): ĠSingle < T > Ġ= Ċ ĉ retry When Ġ{ Ġerrors Ġ-> Ġerrors . flatMap Single ( transformation ) Ġ} Ċ Ċ fun Ġ< T > ĠMaybe < T >. retry With ( transformation : Ġ( Throwable ) Ġ-> ĠSingle < *> ): ĠMaybe < T > Ġ= Ċ ĉ retry When Ġ{ Ġerrors Ġ-> Ġerrors . flatMap Single ( transformation ) Ġ} Ċ Ċ fun ĠComp letable . retry With ( transformation : Ġ( Throwable ) Ġ-> ĠSingle < *> ): ĠComp letable Ġ= Ċ ĉ retry When Ġ{ Ġerrors Ġ-> Ġerrors . flatMap Single ( transformation ) Ġ} Ċ Ċ fun Ġ< T > ĠObservable < T >. retry Delayed ( delay : ĠLong , Ġtime Unit : ĠTimeUnit , Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation ()) Ġ= Ċ ĉ retry With ( delay Transformation ( delay , Ġtime Unit , Ġscheduler )) Ċ Ċ fun ĠComp letable . retry Delayed ( delay : ĠLong , Ġtime Unit : ĠTimeUnit , Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation ()) Ġ= Ċ ĉ retry With ( delay Transformation ( delay , Ġtime Unit , Ġscheduler )) Ċ Ċ fun Ġ< T > ĠSingle < T >. retry Delayed ( delay : ĠLong , Ġtime Unit : ĠTimeUnit , Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation ()) Ġ= Ċ ĉ retry With ( delay Transformation ( delay , Ġtime Unit , Ġscheduler )) Ċ Ċ fun Ġ< T > ĠMaybe < T >. retry Delayed ( delay : ĠLong , Ġtime Unit : ĠTimeUnit , Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation ()) Ġ= Ċ ĉ retry With ( delay Transformation ( delay , Ġtime Unit , Ġscheduler )) Ċ Ċ fun Ġpredicate Error Transformation ( predicate : Ġ( Throwable ) Ġ-> ĠBoolean ) Ġ= Ġ{ Ġthrowable : ĠThrowable Ġ-> Ċ ĉ if Ġ( predicate ( throwable )) ĠSingle . error ( throwable ) Ċ ĉ else ĠSingle . just ( throwable ) Ċ } Ċ Ċ fun Ġ< T > ĠObservable < T >. retry Delayed Until ( ĊĠĠĠ Ġdelay : ĠLong , ĊĠĠĠ Ġtime Unit : ĠTimeUnit , ĊĠĠĠ Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation (), ĊĠĠĠ Ġthrowable Predicate : Ġ(( Throwable ) Ġ-> ĠBoolean ), Ċ ): ĠObservable < T > Ġ= Ċ ĉ retry With ( ĊĠĠĠĠĠĠĠ Ġcombine ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Transformation ( delay , Ġtime Unit , Ġscheduler ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate Error Transformation ( throwable Predicate ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ Ċ fun Ġcount Error Transformation ( ĊĠĠĠ Ġlimit : ĠInt , ĊĠĠĠ Ġstart : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġupdater : Ġ( Int ) Ġ-> ĠInt Ġ= Ġ{ Ġit Ġ+ Ġ 1 Ġ}, Ċ ): Ġ( Throwable ) Ġ-> Ġ@ NonNull ĠSingle < Throwable > Ġ= Ċ ĉ Atomic Integer ( start ). let Ġ{ Ġcounter Ġ-> Ċĉ ĉ { Ġthrowable : ĠThrowable Ġ-> Ċĉĉ ĉ val Ġcount Ġ= Ġcounter . get () Ċĉĉ ĉ val Ġnew Count Ġ= Ġupdater ( count ) Ċĉĉ ĉ counter . set ( new Count ) Ċĉĉ ĉ if Ġ( new Count Ġ> Ġlimit ) ĠSingle . error ( throwable ) Ċĉĉ ĉ else ĠSingle . just ( throwable ) Ċĉ ĉ } Ċ ĉ } Ċ Ċ fun Ġ< T > ĠObservable < T >. retry Reset ( handler : Ġ( Observable < Throwable >) Ġ-> ĠObservable Source < *> ): ĠObservable < T > Ġ= Ċ ĉ Single . from Callable Ġ{ ĠPublish Subject . create < Unit >() Ġ} Ċĉ ĉ . flatMap Observable Ġ{ Ġsignal Ġ-> Ċĉĉ ĉ this . do On Next Ġ{ Ġsignal . onNext ( Unit ) Ġ} Ċĉĉĉ ĉ . retry When Ġ{ Ċĉĉĉĉ ĉ Observable . defer Ġ{ Ġhandler ( it ) Ġ} Ċĉĉĉĉĉ ĉ . take Until ( signal ) Ċĉĉĉĉĉ ĉ . repeat () Ċĉĉĉ ĉ } Ċĉ ĉ } Ċ Ċ fun Ġtimeout Error Transformation ( ĊĠĠĠ Ġtimeout : ĠLong , ĊĠĠĠ Ġtime Unit : ĠTimeUnit , ĊĠĠĠ Ġtime Ms Supplier : Ġ() Ġ-> ĠLong Ġ= Ġ{ ĠSystem . currentTimeMillis () Ġ}, Ċ ): Ġ( Throwable ) Ġ-> Ġ@ NonNull ĠSingle < Throwable > Ġ= Ċ ĉ @ Suppress (" Replace Single Line Let ") Ċ ĉ time Ms Supplier (). let Ġ{ Ġtime Before Ġ-> Ċĉ ĉ predicate Error Transformation Ġ{ Ġ_ Ġ-> Ċĉĉ ĉ time Ms Supplier () Ġ- Ġtime Before Ġ> Ġtime Unit . to Millis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċĉ ĉ } Ċ ĉ } Ċ Ċ fun Ġexponential Backoff Transformation ( ĊĠĠĠ Ġinitial Delay Ms : ĠLong Ġ= Ġ 1 0 0 L , ĊĠĠĠ Ġcap Delay Ms : ĠLong Ġ= Ġ 3 0 0 0 0 L , ĊĠĠĠ Ġmultiplier : ĠLong Ġ= Ġ 2 L , ĊĠĠĠ Ġscheduler : ĠScheduler Ġ= ĠS chedulers . computation (), Ċ ): Ġ( Throwable ) Ġ-> Ġ@ NonNull ĠSingle < Throwable > Ġ= Ċ ĉ variable Delay Transformation < Throwable >( initial Delay Ms , Ġscheduler ) Ġ{ Ġdelay Ms Ġ-> Ċĉ ĉ min ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcap Delay Ms , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Ms Ġ* Ġmultiplier ĊĠĠĠĠĠĠĠ Ġ) Ċ ĉ } Ċ Ċ fun Ġ< T > ĠObservable < T >. onError Return And Throw ( value : ĠT ): ĠObservable < T > Ġ= Ċ ĉ onError Resume Next Ġ{ Ġerror : ĠThrowable Ġ-> ĠObservable . just ( value ). concat With ( Observable . error ( error )) Ġ}