package Ġpage . sm ir nov . w alle ster . core . util . extension Ċ Ċ import Ġandroid . util . Log Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ /** Ċ Ġ* ĠTrans forms Ġ[ Result ] Ġwith Ġ[ T ] Ġto Ġ[ Result ] Ġwith Ġ[ Unit ] Ċ Ġ*/ Ċ fun Ġ< T > ĠResult < T >. ignore Value (): ĠResult < Unit > Ġ{ ĊĠĠĠ Ġreturn Ġmap Ġ{ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCalls Ġ[ block ] Ġin Ġboth Ġ[ on Success ] Ġand Ġ[ on Failure ] Ċ Ġ*/ Ċ inline Ġfun Ġ< T > ĠResult < T >. on Finish ( cross inline Ġblock : Ġ() Ġ-> ĠUnit ): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġblock () Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ Ġblock () Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSame Ġas Ġ[ on Finish ] Ġbut Ġexecutes Ġ[ block ] Ġon Ġ[ Dispatch ers . Main ] Ċ Ġ*/ Ċ suspend Ġinline Ġfun Ġ< T > ĠResult < T >. on Finish With Main Context ( cross inline Ġblock : Ġ() Ġ-> ĠUnit ): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSame Ġas Ġ[ on Failure ] Ġbut Ġexecutes Ġ[ block ] Ġon Ġ[ Dispatch ers . Main ] Ċ Ġ*/ Ċ suspend Ġinline Ġfun Ġ< T > ĠResult < T >. on Failure With Main Context ( cross inline Ġblock : Ġ( t : ĠThrowable ) Ġ-> ĠUnit ): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . on Failure Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSame Ġas Ġ[ on Success ] Ġbut Ġexecutes Ġ[ block ] Ġon Ġ[ Dispatch ers . Main ] Ċ Ġ*/ Ċ suspend Ġinline Ġfun Ġ< T > ĠResult < T >. on Success With Main Context ( cross inline Ġblock : Ġ( value : ĠT ) Ġ-> ĠUnit ): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . on Success Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIf Ġ[ Result ] Ġis Ġfailure , Ġlogs Ġ[ Throwable ] Ġto Ġ[ Tim ber . e ] Ċ Ġ*/ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġ< T > ĠResult < T >. on Failure Log (): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . on Failure Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠHere Ġwas Ġa ĠTim ber Ġcall , Ġbut Ġas Ġwe Ġcan 't Ġuse Ġlibraries ĠâĢĶ Ġhere 's Ġa Ġgeneric Ġtag ĊĠĠĠĠĠĠĠ ĠLog . e (" W TEST ", Ġ" on Failure ", Ġt ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIf Ġ[ Result ] Ġis Ġfailure , Ġlogs Ġ[ Throwable ] Ġand Ġ[ lazy Message ] Ġto Ġ[ Tim ber . e ] Ċ Ġ*/ Ċ inline Ġfun Ġ< T > ĠResult < T >. on Failure Log ( cross inline Ġlazy Message : Ġ(() Ġ-> ĠAny )): ĠResult < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis . on Failure Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġlazy Message (). toString () ĊĊĠĠĠĠĠĠĠ Ġ// ĠHere Ġwas Ġa ĠTim ber Ġcall , Ġbut Ġas Ġwe Ġcan 't Ġuse Ġlibraries ĠâĢĶ Ġhere 's Ġa Ġgeneric Ġtag ĊĠĠĠĠĠĠĠ ĠLog . e (" W TEST ", Ġmessage , Ġt ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠResult < T >. flatMap ( transform : Ġ( value : ĠT ) Ġ-> ĠResult < R >): ĠResult < R > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġresult Ġ= Ġget OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> ĠResult . failure ( exception OrNull () Ġ?: ĠThrowable (" Unknown Ġfailure ")) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< R , ĠT Ġ: ĠR > ĠResult < T >. recover Result ( cross inline Ġtransform : Ġ( exception : ĠThrowable ) Ġ-> ĠResult < R >): ĠResult < R > Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġexception Ġ= Ġexception OrNull ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtransform ( exception ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< T > ĠResult < T >. to Flow Throw On Failure (): ĠFlow < T > Ġ{ ĊĠĠĠ Ġreturn Ġflow Ġ{ Ġemit ( this @ to Flow Throw On Failure ) Ġ}. map Ġ{ Ġit . get OrThrow () Ġ} Ċ } Ċ