package Ġcom . my k . feature . search . data . repository Ċ Ċ import Ġandroidx . paging . Pager Ċ import Ġandroidx . paging . Paging Config Ċ import Ġandroidx . paging . Paging Data Ċ import Ġandroidx . paging . map Ċ import Ġcom . my k . feature . search . data . model . to Domain Model Ċ import Ġcom . my k . feature . search . data . model . to Local DataModel Ċ import Ġcom . my k . feature . search . data . service . Po ke ApiService Ċ import Ġcom . my k . feature . search . domain . model . Item Domain Model Ċ import Ġcom . my k . feature . search . domain . model . Pokemon Domain Model Ċ import Ġcom . my k . feature . search . domain . repository . Pokemon Repository Ċ import Ġcom . my k . library . data . dao . Item Dao Ċ import Ġcom . my k . library . data . dao . Pokemon Dao Ċ import Ġcom . my k . library . data . model . Pokemon Local DataModel Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . emit All Ċ import Ġkotlinx . coroutines . flow . filter NotNull Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġtim ber . log . Tim ber Ċ Ċ private Ġconst Ġval ĠPAGE _ SIZE Ġ= Ġ 2 0 Ċ Ċ internal Ġclass ĠPokemon Repository Impl ( ĊĠĠĠ Ġprivate Ġval Ġservice : ĠPo ke ApiService , ĊĠĠĠ Ġprivate Ġval Ġpokemon Dao : ĠPokemon Dao , ĊĠĠĠ Ġprivate Ġval Ġitem Dao : ĠItem Dao , Ċ ) Ġ: ĠPokemon Repository Ġ{ ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġoverride Ġfun Ġget Pokemon Page (): ĠFlow < Paging Data < Pokemon Domain Model >> Ġ= ĠP ager ( ĊĠĠĠĠĠĠĠ Ġconfig Ġ= ĠP aging Config ( PAGE _ SIZE ), ĊĠĠĠĠĠĠĠ Ġremote Mediator Ġ= ĠPokemon Remote Mediator ( pokemon Dao , Ġservice ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpokemon Dao . paging Source () ĊĠĠĠ Ġ}. flow . map Ġ{ Ġpaging Data Ġ-> ĊĠĠĠĠĠĠĠ Ġpaging Data . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" g lop Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Domain Model ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Pokemon ( id : ĠInt ) Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġto Ġuse Ġa Ġcoroutine Ġscope Ġin Ġorder Ġto Ġuse Ġ` async ` ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠQuery Ġa Ġpokemon Ġfrom Ġapi , Ġthen Ġcache Ġthat Ġpokemon Ġin Ġlocal Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġfunction Ġneeds Ġto Ġbe Ġasynchronous Ġso Ġthat Ġthis Ġflow Ġcan Ġimmediately Ġemit Ġcached ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdata Ġwithout Ġwaiting Ġfor Ġthe Ġbackend ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġservice . get Pokemon ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Dao . update ( response . to Local DataModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġcached Ġpokemon Ġfrom Ġlocal Ġdata Ġstore Ġas Ġflow , Ġconvert Ġit Ġto Ġflow Ġof Ġdomain Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthen Ġforward Ġthe Ġemission s Ġto Ġflow Ġbuilder . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠThis Ġcode Ġis Ġwritten Ġout Ġin Ġa Ġmore Ġverbose Ġstyle Ġintention ally Ġto Ġmake Ġthe Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof Ġdata Ġmore Ġapparent . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal DataModel : ĠFlow < Pokemon Local DataModel > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon Dao . get Pokemon ( id ). filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain Model : ĠFlow < Pokemon Domain Model > Ġ= Ġlocal DataModel . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Domain Model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit All ( domain Model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġoverride Ġfun Ġget Items (): ĠFlow < Paging Data < Item Domain Model >> Ġ= ĠP ager ( ĊĠĠĠĠĠĠĠ Ġconfig Ġ= ĠP aging Config ( PAGE _ SIZE ), ĊĠĠĠĠĠĠĠ Ġremote Mediator Ġ= ĠItem Remote Mediator ( item Dao , Ġservice ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Dao . getPage () ĊĠĠĠ Ġ}. flow . map Ġ{ Ġpaging Data Ġ-> ĊĠĠĠĠĠĠĠ Ġpaging Data . map Ġ{ Ġit . to Domain Model Ġ} ĊĠĠĠ Ġ} Ċ } Ċ