package Ġcom . android . t ait asci ore . ch ht est . data . repository . impl Ċ Ċ import Ġcom . android . t ait asci ore . ch ht est . data . entity . mapper . Coin H istorical List Mapper Ċ import Ġcom . android . t ait asci ore . ch ht est . data . entity . mapper . Coin ListResponse Mapper Ċ import Ġcom . android . t ait asci ore . ch ht est . data . entity . mapper . Coin Mapper Ċ import Ġcom . android . t ait asci ore . ch ht est . data . repository . Coin Repository Ċ import Ġcom . android . t ait asci ore . ch ht est . data . repository . datasource . coin list . Coin Cloud DataSource Ċ import Ġcom . android . t ait asci ore . ch ht est . data . repository . datasource . coin list . Coin Disk DataSource Ċ import Ġcom . android . t ait asci ore . ch ht est . domain . model . Coin Ċ import Ġcom . android . t ait asci ore . ch ht est . domain . model . Coin List Ċ import Ġcom . android . t ait asci ore . ch ht est . domain . model . H istorical Item Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠThis Ġmethod Ġrepository Ġet ches Ġthe Ġlist Ġof Ġcrypt oc urrencies Ġby Ġpagination , Ċ Ġ* Ġa Ġsingle Ġcoin Ġdetail Ġand Ġthe Ġhistorical Ġdata Ġfor Ġa Ġparticular Ġcoin . Ċ Ġ* ĠReturned Ġobservable s Ġare Ġthen Ġmapped Ġto Ġthe Ġappro pi ate Ġdomain - layer Ġmodel Ċ Ġ* Ġusing Ġthe Ġappro pi ate Ġmap pers Ċ Ġ* Ċ Ġ* ĠThe Ġf irt Ġtime , Ġthe Ġcloud Ġdata Ġsor uce Ġis Ġused , Ġby Ġf iring Ġa Ġrequest Ġto Ġthe ĠAPI . Ċ Ġ* ĠThe Ġdata Ġreturned Ġis Ġthen Ġstored Ġlocally Ġusing ĠRealm Ġunder Ġthe Ġh ood Ġwith Ġthe Ġabstraction Ċ Ġ* Ġof Ġthe Ġdata Ġsources Ċ Ġ*/ Ċ class ĠCoin Repository Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin Cloud DataSource : ĠCoin Cloud DataSource , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin Disk DataSource : ĠCoin Disk DataSource , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin ListResponse Mapper : ĠCoin ListResponse Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin Mapper : ĠCoin Mapper , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin H istorical List Mapper : ĠCoin H istorical List Mapper ) Ġ: ĠCoin Repository Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġf etches Ġthe Ġlist Ġof Ġcrypt oc urrencies Ġwith Ġpagination ĊĠĠĠĠ Ġ* Ġ@ param Ġpage ĠPage Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Coins ( page : ĠInt ): ĠObservable < Coin List > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisk Observable Ġ= Ġcoin Disk DataSource . getC oin s ( page ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcloud Observable Ġ= Ġcoin Cloud DataSource . getC oin s ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġcoin ListResponse Entity Ġ-> Ġcoin Disk DataSource . store Coins ( coin ListResponse Entity . coins ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcoin ListResponse Mapper . map ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdisk Observable . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . coins Ġ!= Ġnull Ġ-> ĠObservable . just ( coin ListResponse Mapper . map ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcloud Observable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġf etches Ġa Ġsingle Ġcoin Ġdetails ĊĠĠĠĠ Ġ* Ġ@ param Ġcoin Id ĠCoin ĠID ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Coin ( coin Id : ĠInt ): ĠObservable < Coin > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcoin Cloud DataSource . getC oin ( coin Id ). map Ġ{ Ġcoin Mapper . map ( it . coin ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġf etches Ġthe Ġhistorical Ġdata Ġfor Ġa Ġparticular Ġcoin ĊĠĠĠĠ Ġ* Ġ@ param Ġid ĠCoin ĠID ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Coin H istorical ( id : ĠInt ): ĠObservable < List < H istorical Item >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisk Ob serv av le Ġ= Ġcoin Disk DataSource . getC oin H istorical ( id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcloud Observable Ġ= Ġcoin Cloud DataSource . getC oin H istorical ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġcoin H istorical List Entity Ġ-> Ġcoin Disk DataSource . store H istorical ( id , Ġcoin H istorical List Entity ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcoin H istorical List Mapper . map ( it . h istorical ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġlocal Ġdata Ġsource Ġfirst ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġcase Ġof Ġfailure , Ġfire Ġrequest Ġto Ġthe ĠAPI ĊĠĠĠĠĠĠĠ Ġreturn Ġdisk Ob serv av le . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . h istorical Ġ!= Ġnull Ġ-> ĠObservable . just ( coin H istorical List Mapper . map ( it . h istorical )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcloud Observable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }