package Ġcom . ville val ta . imgur . utils Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ /** Ċ Ġ* ĠUniversal Ġutilities Ġfor Ġarchitecture Ġcomponents Ġand Ġkotlin Ċ Ġ*/ Ċ Ċ object ĠCor outines Ġ{ ĊĊĠ Ġfun Ġ< T Ġ: ĠAny > Ġio ( do Work : Ġsuspend Ġ(() Ġ-> ĠT ? )): ĠJob Ġ= ĊĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠ Ġdo Work () ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġ< T Ġ: ĠAny > Ġmain ( do Work : Ġsuspend Ġ(() Ġ-> ĠT ? )): ĠJob Ġ= ĊĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠ Ġdo Work () ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġ< T Ġ: ĠAny > Ġio Then Main ( do Work : Ġsuspend Ġ(() Ġ-> ĠT ? ), Ġcallback : Ġ(( T ?) Ġ-> ĠUnit )? Ġ= Ġnull ): ĠJob Ġ= ĊĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠ Ġval Ġdata Ġ= ĠCor outine Scope ( Dispatch ers . IO ). async Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ async Ġdo Work () ĊĠĠĠĠĠ Ġ}. await () ĊĠĠĠĠĠ Ġcallback ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġit ( data ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠDeferred < T >. to LiveData (): ĠLive Data < T > Ġ{ ĊĠ Ġval Ġresult Ġ= ĠMutable LiveData < T >() ĊĠ ĠCor outines . io Then Main ({ ĊĠĠĠ Ġawait () ĊĠ Ġ}, Ġ{ ĊĠĠĠ Ġresult . value Ġ= Ġit ĊĠ Ġ}) ĊĠ Ġreturn Ġresult Ċ } Ċ Ċ /* Ċ * ĠL IVED ATA Ċ * Ġ*/ Ċ Ċ fun Ġ< IN , ĠOUT > ĠLive Data < IN >. map ( function : Ġ( IN ) Ġ-> ĠOUT ): ĠLive Data < OUT > Ġ= ĊĠ ĠTransform ations . map ( this , Ġfunction ) Ċ Ċ fun Ġ< IN , ĠOUT > ĠLive Data < IN >. switch Map ( function : Ġ( IN ) Ġ-> ĠLive Data < OUT >): ĠLive Data < OUT > Ġ{ ĊĠ Ġreturn ĠTransform ations . switch Map ( this , Ġfunction ) Ċ } Ċ Ċ fun ĠMed iator LiveData <* >. add Sources ( var arg Ġsources : ĠLive Data <* >, Ġobserver : ĠObserver < Any >) Ġ{ ĊĠ Ġadd Sources ( sources , Ġobserver ) Ċ } Ċ Ċ @ Jvm Name (" add Sources Array ") Ċ fun ĠMed iator LiveData <* >. add Sources ( sources : ĠArray < out ĠLive Data <* >>, Ġobserver : ĠObserver < Any >) Ġ{ ĊĠ Ġsources . forEach Ġ{ ĊĠĠĠ Ġadd Source ( it Ġas ĠLive Data < Any >, Ġobserver ) ĊĠ Ġ} Ċ } Ċ Ċ object ĠLive Datas Ġ{ ĊĠ Ġinline Ġfun Ġ< T > Ġmap Multiple ( var arg Ġlive Datas : ĠLive Data <* >, Ġcross inline Ġf : Ġ() Ġ-> ĠT ): ĠLive Data < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠMed iator LiveData < T >(), ĠObserver < Any > Ġ{ ĊĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Sources ( live Datas , Ġthis ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġf () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /* Ċ * Ġ ĠK OT LIN Ċ * Ġ*/ Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠT . try Let ( block : Ġ( T ) Ġ-> ĠR ): ĠR ? Ġ= Ġtry Ġ{ ĊĠ Ġblock ( this ) Ċ } Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠ Ġnull Ċ } Ċ Ċ inline Ġfun Ġ< T > Ġtry OrNull ( f : Ġ() Ġ-> ĠT ) Ġ= Ġtry Ġ{ ĊĠ Ġf () Ċ } Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠ Ġnull Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠAny > Ġif Let ( var arg Ġelements : ĠT ?, Ġblock : Ġ( List < T >) Ġ-> ĠUnit ) Ġ{ ĊĠ Ġif Ġ( elements . all Ġ{ Ġit Ġ!= Ġnull Ġ}) Ġ{ ĊĠĠĠ Ġblock ( elements . filter NotNull ()) ĊĠ Ġ} Ċ } Ċ Ċ fun ĠBoolean ?. toInt (): ĠInt Ġ{ ĊĠ Ġreturn Ġif Ġ( this Ġ== Ġtrue ) Ġ 1 Ġelse Ġ 0 Ċ }