package Ġkr . os am . phone var . data . source . unit Ċ Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġio . reactivex . Flow able Ċ import Ġkr . os am . phone var . data . Unit Item ĊĊ Ċ class ĠUnit Repository ( ĊĠĠĠ Ġprivate Ġval Ġunit Remote DataSource : ĠUnit DataSource , ĊĠĠĠ Ġprivate Ġval Ġunit Local DataSource : ĠUnit DataSource Ċ ) Ġ: ĠUnit DataSource Ġ{ ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġvar Ġcached Unit : ĠLinkedHashMap < Int , ĠUnit Item > Ġ= ĠLinkedHashMap () ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġvar Ġcache Is Dirty Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġget Units (): ĠFlow able < List < Unit Item >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! cache Is Dirty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFlow able . from Iterable ( cached Unit . values ). toList (). to Flow able () ĊĊĠĠĠĠĠĠĠ Ġval Ġremote Units : ĠFlow able < List < Unit Item >> Ġ= Ġget And Save Remote Units () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cache Is Dirty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Units ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Units : ĠFlow able < List < Unit Item >> Ġ= Ġget And Cache Local Units () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlow able . concat ( local Units , Ġremote Units ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġunits : ĠList < Unit Item ?> Ġ-> Ġunits . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Or Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Unit ( unit Item : ĠUnit Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġunit Remote DataSource . save Unit ( unit Item ) ĊĠĠĠĠĠĠĠ Ġunit Local DataSource . save Unit ( unit Item ) ĊĠĠĠĠĠĠĠ Ġcached Unit [ unit Item . id . toInt ()] Ġ= Ġunit Item ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget And Cache Local Units (): ĠFlow able < List < Unit Item >> Ġ= ĊĠĠĠĠĠĠĠ Ġunit Local DataSource . get Units () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow able . from Iterable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do On Next Ġ{ Ġt : ĠUnit Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Unit [ t . id . toInt ()] Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able () ĊĊĠĠĠ Ġprivate Ġfun Ġget And Save Remote Units (): ĠFlow able < List < Unit Item >> Ġ= ĊĠĠĠĠĠĠĠ Ġunit Remote DataSource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Units () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġunits Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow able . from Iterable ( units ). do On Next Ġ{ Ġunit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunit Local DataSource . save Unit ( unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Unit . put ( unit . id . toInt (), Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList (). to Flow able (). do On Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Is Dirty Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrefresh Units () Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Is Dirty Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠUnit Repository ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Remote DataSource : ĠUnit DataSource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunit Local DataSource : ĠUnit DataSource ĊĠĠĠĠĠĠĠ Ġ): ĠUnit Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE Ġ?: ĠUnit Repository ( unit Remote DataSource , Ġunit Local DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĠINSTANCE Ġ= Ġthis Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġdestroy Instance () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }