package Ġcom . ny iny i ht un l win . data . repository Ċ Ċ import Ġcom . ny iny i ht un l win . data . database . entity . Movie Entity Ċ import Ġcom . ny iny i ht un l win . data . datasource . cache . Cache Movie DataSource Ċ import Ġcom . ny iny i ht un l win . data . datasource . remote . Network Movie DataSource Ċ import Ġcom . ny iny i ht un l win . data . mapper . Movie Mapper Ċ import Ġcom . ny iny i ht un l win . domain . model . movie . Movie Ċ import Ġcom . ny iny i ht un l win . domain . repository . Movie Repository Ċ import Ġio . reactivex . Observable Ċ Ċ class ĠMovie Repository Impl ( ĊĠĠĠ Ġprivate Ġval Ġnetwork Movie DataSource : ĠNetwork Movie DataSource , ĊĠĠĠ Ġprivate Ġval Ġcache Movie DataSource : ĠCache Movie DataSource , ĊĠĠĠ Ġprivate Ġval Ġmovie Mapper : ĠMovie Mapper Ċ ) Ġ: ĠMovie Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Now Playing Movie List ( page : ĠInt ?): ĠObservable < List < Movie >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . concat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Movie DataSource . getAll Movies () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isEmpty ()) Ġfetch Now Playing Movie List ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠObservable . just ( movie Mapper . map Movie List ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfetch Now Playing Movie List ( page ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Now Playing Movie List ( page : ĠInt ?): ĠObservable < List < Movie >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnetwork Movie DataSource . get Now Playing Movies ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . results Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Iterable Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . overview , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . release _ date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// image . t mdb . org / t / p / w 5 0 0 ${ it . poster _ path }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// image . t mdb . org / t / p / w 5 0 0 ${ it . backdrop _ path }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList (). to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġcache Movie DataSource . save Movies ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmovie Mapper . map Movie List ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Movie ById ( id : ĠInt ): ĠObservable < Movie > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Movie DataSource . get Movie ById ( id ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . movie Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . overview , Ġit . release Date , Ġit . poster Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . backdrop Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }