/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . y app . growth . domain Ċ Ċ /** Ċ Ġ* ĠA Ġgeneric Ġclass Ġthat Ġholds Ġa Ġvalue Ġwith Ġits Ġloading Ġstatus . Ċ Ġ* Ġ@ param Ġ< T > Ċ Ġ*/ Ċ sealed Ġclass ĠNetwork Result < out ĠR > Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠSuccess < out ĠT >( val Ġdata : ĠT ) Ġ: ĠNetwork Result < T >() ĊĠĠĠ Ġdata Ġclass ĠError ( val Ġexception : ĠException ) Ġ: ĠNetwork Result < Nothing >() ĊĠĠĠ Ġobject ĠLoading Ġ: ĠNetwork Result < Nothing >() ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSuccess < *> Ġ-> Ġ" Success [ data =$ data ]" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Ġ-> Ġ" Error [ exception =$ exception ]" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoading Ġ-> Ġ" Loading " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ` true ` Ġif Ġ[ Network Result ] Ġis Ġof Ġtype Ġ[ Success ] Ġ& Ġholds Ġnon - null Ġ[ Success . data ]. Ċ Ġ*/ Ċ val ĠNetwork Result <* >. succeeded ĊĠĠĠ Ġget () Ġ= Ġthis Ġis ĠNetwork Result . Success Ċ Ċ fun Ġ< T > ĠNetwork Result < T >. success Or ( fallback : ĠT ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġ( this Ġas ? ĠNetwork Result . Success < T >) ?. data Ġ?: Ġfallback Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠNetwork Result < T >. map ( transform : Ġ( T ) Ġ-> ĠR ): ĠNetwork Result < R > Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> ĠNetwork Result . Success ( transform ( data )) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠNetwork Result < T >. map Catch ing ( transform : Ġ( T ) Ġ-> ĠR ): ĠNetwork Result < R > Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġrun Catch ing Ġ{ Ġtransform ( data ) Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠNetwork Result < T >. zip ( other : ĠR ): ĠNetwork Result < Pair < T , ĠR >> Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> ĠNetwork Result . Success ( data Ġto Ġother ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠT . run Catch ing ( transform : Ġ( T ) Ġ-> ĠR ): ĠNetwork Result < R > Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠNetwork Result . Success ( transform ( this )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNetwork Result . Error ( e Ġas ĠException ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠNetwork Result < T >. run Catch ing With ( consumer : Ġ( T ) Ġ-> ĠUnit ): ĠNetwork Result < T > Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< R , ĠT > ĠNetwork Result < T >. fold ( ĊĠĠĠ ĠonSuccess : Ġ( value : ĠT ) Ġ-> ĠR , ĊĠĠĠ ĠonError : Ġ( exception : ĠException ) Ġ-> ĠR Ċ ): ĠR Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> ĠonSuccess ( data ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠonError ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠAny () Ġas ĠR Ġ// ĠTODO ĠLoading ĠType ĠìĤ Ń ìłľ Ġdan . d ìĻĢ Ġë§ Ĳ íķĺê¸° ĊĠĠĠ Ġ} Ċ Ċ suspend Ġfun Ġ< T , ĠR > ĠNetwork Result < T >. flatMap ( transform : Ġsuspend Ġ( T ) Ġ-> ĠNetwork Result < R >) Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġtransform ( data ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠ Ġ} Ċ Ċ suspend Ġfun Ġ< T , ĠR , ĠU > ĠPair < Network Result < T >, ĠNetwork Result < R >> . map ( transform : Ġsuspend Ġ( T , ĠR ) Ġ-> ĠU ): ĠNetwork Result < U > Ġ= ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ( first . succeeded ) Ġ&& Ġ( second . succeeded ) Ġ-> ĠNetwork Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( first Ġas ĠNetwork Result . Success ). data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( second Ġas ĠNetwork Result . Success ). data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ( first . succeeded ) Ġ&& Ġ( second . succeeded ). not () Ġ-> ĠNetwork Result . Error (( second Ġas ĠNetwork Result . Error ). exception ) ĊĠĠĠĠĠĠĠ Ġ( first . succeeded ). not () Ġ&& Ġ( second . succeeded ) Ġ-> ĠNetwork Result . Error (( first Ġas ĠNetwork Result . Error ). exception ) ĊĠĠĠĠĠĠĠ Ġ( first . succeeded ). not () Ġ&& Ġ( second . succeeded ). not () Ġ-> ĠNetwork Result . Error (( first Ġas ĠNetwork Result . Error ). exception ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠNetwork Result . Loading ĊĠĠĠ Ġ} Ċ Ċ suspend Ġfun Ġ< T > ĠNetwork Result < T >. merge ( supplier : Ġsuspend Ġ() Ġ-> ĠNetwork Result < T >): ĠNetwork Result < List < T >> Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġsupplier . invoke ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( result . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> ĠNetwork Result . Success ( listOf ( this . data , Ġresult . data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ suspend Ġfun Ġ< T > ĠNetwork Result < List < T >> . add ( supplier : Ġsuspend Ġ() Ġ-> ĠNetwork Result < T >): ĠNetwork Result < List < T >> Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( this . exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġsupplier . invoke ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( result . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> ĠNetwork Result . Loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> ĠNetwork Result . Success ( data Ġ+ Ġresult . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T > ĠNetwork Result < T >. on Success ( action : Ġ( T ) Ġ-> ĠUnit ): ĠNetwork Result < T > Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠNetwork Result . Success ) Ġaction ( data ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠNetwork Result < T >. onError ( action : Ġ( Exception ) Ġ-> ĠUnit ): ĠNetwork Result < T > Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠNetwork Result . Error ) Ġaction ( exception ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠNetwork Result < T >. map Error ( transform WithError : Ġ( Exception ) Ġ-> ĠException ): ĠNetwork Result < T > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠNetwork Result . Error ( transform WithError ( exception )) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< R , ĠT Ġ: ĠR > ĠNetwork Result < T >. getOrElse ( onError : Ġ( exception : ĠThrowable ) Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Success Ġ-> Ġdata ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Error Ġ-> ĠonError ( exception ) ĊĠĠĠĠĠĠĠ Ġis ĠNetwork Result . Loading Ġ-> Ġerror (" not Ġsupport Ġloading Ġtype ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< T , ĠU > ĠPair < Network Result < T >, ĠNetwork Result < U >> . combine ( on Success : Ġsuspend Ġ( Pair < T , ĠU >) Ġ-> ĠUnit , ĠonError : Ġsuspend Ġ( exception : ĠException ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġfirst . on Success Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġsecond . on Success Ġ{ Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ( Pair ( t , Ġu )) ĊĠĠĠĠĠĠĠ Ġ}. onError Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠ Ġ}. onError Ġ{ ĠonError ( it ) Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< T , ĠU , ĠV > ĠTrip le < Network Result < T >, ĠNetwork Result < U >, ĠNetwork Result < V >> . combine ( on Success : Ġsuspend Ġ( Triple < T , ĠU , ĠV >) Ġ-> ĠUnit , ĠonError : Ġsuspend Ġ( exception : ĠException ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġfirst . on Success Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġsecond . on Success Ġ{ Ġu Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthird . on Success Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ( Triple ( t , Ġu , Ġv )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. onError Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. onError Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠ Ġ}. onError Ġ{ ĠonError ( it ) Ġ} Ċ } Ċ