package Ġdev . per cul a . k tx Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġkotlinx . coroutines .* Ċ Ċ fun Ġ< T > ĠMutable LiveData < T >. notify Observer s (): ĠMutable LiveData < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠSimilar Ġto ĠLive Data . map Ġ{}, Ġbut Ġwith Ġan Ġinitial Ġvalue Ġfor Ġthe ĠLive Data . Ċ Ġ*/ Ċ inline Ġfun Ġ< X , ĠY > ĠLive Data < X >. map ( initial Value : ĠY , Ġcross inline Ġtransform : Ġ( X ) Ġ-> ĠY ?): ĠLive Data < Y > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMed iator LiveData < Y >() ĊĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġinitial Value ĊĠĠĠĠĠĠĠ Ġresult . add Source ( this ) Ġ{ Ġresult . value Ġ= Ġtransform ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠMaps Ġthe Ġvalue Ġfrom Ġthe Ġsource Ġ[ LiveData ] Ġusing Ġthe Ġ[ transform ] Ġfunction Ġinto Ġa Ġ[ Mutable LiveData ]. Ċ Ġ* ĠWhen Ġthe Ġvalue Ġis Ġset Ġ( by Ġtwo - way Ġdata Ġbinding , Ġfor Ġexample ), Ġ[ on Update ] Ġis Ġcalled . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġparticularly Ġuseful Ġfor Ġtwo - way ĠAndroid ĠData Binding Ġwith Ġtext Ġfields . ĠWhen Ġthe Ġ[ EditText ] Ċ Ġ* Ġsets Ġthe Ġvalue , Ġafter Ġan Ġoptional Ġdelay Ġof Ġ[ update Delay Time MS ], Ġ[ on Update ] Ġcould Ġupdate Ġthe Ċ Ġ* Ġobject Ġon Ġthe Ġnetwork . ĠOr Ġthe Ġvalue Ġwithin Ġthe Ġsource Ġ[ LiveData ] Ġcould Ġbe Ġupdated . Ċ Ġ*/ Ċ inline Ġfun Ġ< X , ĠY > ĠLive Data < X >. map With Update Action ( scope : ĠCor outine Scope Ġ= ĠGlobal Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Delay Time MS : ĠLong Ġ= Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġtransform : Ġ( X ) Ġ-> ĠY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline ĠonUpdate : Ġ( X ?, ĠY ) Ġ-> ĠUnit ): ĠMed iator LiveData < Y > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠMed iator LiveData < Y >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( this @ map With Update Action ) Ġ{ Ġsuper . setValue ( transform ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( value : ĠY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ?. equals ( this . value ) Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . setValue ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ Ġdelay ( update Delay Time MS ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( this @ map With Update Action . value , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSwitch Ġmaps Ġthe Ġvalue Ġfrom Ġthe Ġsource Ġ[ LiveData ] Ġusing Ġthe Ġ[ transform ] Ġfunction Ġinto Ġa Ġ[ Mutable LiveData ]. Ċ Ġ* ĠWhen Ġthe Ġvalue Ġis Ġset Ġ( by Ġtwo - way Ġdata Ġbinding , Ġfor Ġexample ), Ġ[ on Update ] Ġis Ġcalled . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġparticularly Ġuseful Ġfor Ġtwo - way ĠAndroid ĠData Binding Ġwith Ġtext Ġfields . ĠWhen Ġthe Ġ[ EditText ] Ċ Ġ* Ġsets Ġthe Ġvalue , Ġafter Ġan Ġoptional Ġdelay Ġof Ġ[ update Delay Time MS ], Ġ[ on Update ] Ġcould Ġupdate Ġthe Ċ Ġ* Ġobject Ġon Ġthe Ġnetwork . ĠOr Ġthe Ġvalue Ġwithin Ġthe Ġsource Ġ[ LiveData ] Ġcould Ġbe Ġupdated . Ċ Ġ*/ Ċ inline Ġfun Ġ< X , ĠY > ĠLive Data < X >. switch Map With Update Action ( scope : ĠCor outine Scope Ġ= ĠGlobal Scope , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Delay Time MS : ĠLong Ġ= Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġtransform : Ġ( X ) Ġ-> ĠLive Data < Y >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline ĠonUpdate : Ġ( X ?, ĠY ) Ġ-> ĠUnit ): ĠMed iator LiveData < Y > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠMed iator LiveData < Y >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsource : ĠLive Data < Y >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( this @ switch Map With Update Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew LiveData Ġ= Ġtransform ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Ġ== Ġnew LiveData ) Ġreturn @ add Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ?. let Ġ{ Ġremove Source ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġnew LiveData ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Source ( it , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( value : ĠY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ?. equals ( this . value ) Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . setValue ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ Ġdelay ( update Delay Time MS ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate ( this @ switch Map With Update Action . value , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠMaps Ġthe Ġvalue Ġfrom Ġthe Ġsource Ġ[ LiveData ] Ġusing Ġthe Ġ[ transform ] Ġfunction Ġinto Ġa Ġ[ Mutable LiveData ]. Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġparticularly Ġuseful Ġfor Ġtwo - way ĠAndroid ĠData Binding Ġwith Ġtext Ġfields . Ċ Ġ*/ Ċ inline Ġfun Ġ< X , ĠY > ĠLive Data < X >. map To Mutable ( cross inline Ġtransform : Ġ( X ) Ġ-> ĠY ) Ġ: ĠMed iator LiveData < Y > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠMed iator LiveData < Y >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ Ġadd Source ( this @ map To Mutable ) Ġ{ Ġsuper . setValue ( transform ( it )) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ }