package Ġcom . example . core _ data . utils Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ Ċ fun < T > ĠMed iator LiveData < T >. add Source NotNull ( source : ĠLive Data < T > ?, Ġobserver : ĠObserver < T >) Ġ{ ĊĠĠĠ Ġsource ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add Source ( source , Ġobserver ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun < T > ĠMed iator LiveData < T >. remove Source NotNull ( source : ĠLive Data < T > ?) Ġ{ ĊĠĠĠ Ġsource ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . remove Source ( source ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠU > Ġtransformations Map NotNull ( source : ĠLive Data < T > ?, Ġf : Ġ( T ) Ġ-> ĠU ?): ĠLive Data < U ?> ? Ġ{ ĊĠĠĠ Ġreturn Ġsource ?. let Ġ{ ĊĠĠĠĠĠĠĠ ĠTransform ations . map ( it , Ġf ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* Ċ Ġ* ĠThe Ġvalue Ġreceived Ġis Ġreturned Ġon Ġa ĠLive Data Ġas Ċ Ġ* ĠĠ Ġ- Ġnull Ġif Ġthe Ġvalue Ġis Ġnull Ċ Ġ* ĠĠ Ġ- Ġpassed Ġto Ġa Ġfunction Ġand Ġthe Ġvalue Ġreturned Ġfor Ġthat Ġis Ġassigned Ġto Ġthe ĠLive Data Ċ Ġ*/ Ċ fun Ġ< T , ĠU > Ġtransform In LiveData ( value : ĠT ?, Ġf : Ġ( T ) Ġ-> ĠU ): ĠLive Data < U ?> Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= ĠMutable LiveData < U >() ĊĠĠĠ Ġval Ġlocal Value Ġ= Ġif Ġ( value Ġ== Ġnull ) Ġnull Ġelse Ġf ( value ) ĊĊĠĠĠ Ġresponse . post Value ( local Value ) ĊĊĠĠĠ Ġreturn Ġresponse Ċ } ĊĊ Ċ /* Ċ Ġ* ĠFunction Ġthat Ġtake Ġtwo Ġsources < T > Ġand Ġreturn Ġa ĠLive Data < U > Ċ Ġ* Ġ Ġ- ĠIt Ġruns Ġthe Ġsource 1 Ġand Ġif Ġthe Ġresult Ġ!= Ġnull , Ġcall Ġto Ġthe Ġfunction Ġupdate Ġand Ġset Ġthe Ġvalue Ġin Ġthe Ġlive Data Ġcalling Ġto Ġfunction Ċ Ġ* Ġ Ġ- ĠIf Ġsource 1 Ġreturns Ġa Ġnull , Ġthen Ġsource 2 Ġis Ġlaunched Ġand Ġif Ġthe Ġresult Ġis Ġset Ġon Ġthe ĠLive Data , Ġcalling Ġto Ġfunction Ġor Ġnot . Ċ Ġ* Ġ Ġ- Ġupdate () Ġneeds Ġto Ġbe Ġrun Ġin Ġbackground Ċ Ġ*/ Ċ fun Ġ< T , ĠU > Ġadd Multiple DataSource ( ĊĠĠĠ Ġsource 1 : ĠLive Data < T ? >, ĊĠĠĠ Ġsource 2 : ĠLive Data < T ?> ?, ĊĠĠĠ Ġupdate : Ġsuspend Ġ( T ) Ġ-> ĠUnit , ĊĠĠĠ Ġfunction : Ġ( T ?) Ġ-> ĠU ? Ċ ): ĠLive Data < U ?> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠMed iator LiveData < U >() ĊĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( Dispatch ers . IO ) ĊĠĠĠ Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġresult . add Source ( source 1 ) Ġ{ Ġres 1 Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( res 1 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( res 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġfunction ( res 1 ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource 2 ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( source 2 ) Ġ{ Ġres 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġfunction ( res 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġjob ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . is Completed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . coroutine Context ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ fun Ġ< T > Ġtransform No Switch Map ( source : ĠLive Data < T > ?, Ġf : Ġ( T ) Ġ-> ĠT ): ĠLive Data < T > Ġ{ ĊĠĠĠ Ġval Ġres Ġ= ĠMutable LiveData < T >() ĊĊĠĠĠ Ġsource ?. let Ġ{ Ġsource Ġ-> ĊĠĠĠĠĠĠĠ Ġsource . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . post Value ( f ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġres Ċ } Ċ