package Ġcom . high air . weather forecast id . data Ċ Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . emit All Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġretrofit 2 . Response Ċ import Ġcom . high air . weather forecast id . data . Result Ċ Ċ /** Ċ Ġ* ĠA Ġgeneric Ġclass Ġthat Ġcan Ġprovide Ġa Ġresource Ġbacked Ġby Ġboth Ġthe Ġsqlite Ġdatabase Ġand Ġthe Ġnetwork . Ċ Ġ* Ġ[ Architecture ĠGuide ]( https :// developer . android . com / arch ). Ċ Ġ* Ġ[ Result Type ] Ġrepresents Ġthe Ġtype Ġfor Ġdatabase . Ċ Ġ* Ġ[ RequestType ] Ġrepresents Ġthe Ġtype Ġfor Ġnetwork . Ċ Ġ*/ Ċ abstract Ġclass ĠNetwork Bound Resource < Result Type , ĠRequest Type > Ġ{ ĊĊĠĠĠ Ġfun Ġas Flow () Ġ= Ġflow < Result < Result Type >> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġemit ĠDatabase Ġdata Ġfirst ĊĠĠĠĠĠĠĠ Ġif Ġ( should Fetch ( fetch From Local (). first ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Result . Loading ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfetch Ġfrom Ġremote ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Response Ġ= Ġfetch From Remote () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġresponse Ġvalidation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api Response Ġis ĠResult . Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġresponse Ġinto Ġpersistence Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Remote Data ( api Response . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsomething Ġwhen Ġwrong ! Ġemit Ġerror Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Result . Error (( api Response Ġas ĠResult . Error ). exception )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġemit All ( fetch From Local (). map Ġ{ ĠResult . Success ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠForce Ġto Ġget Ġthe Ġdata Ġfrom Ġthe Ġremote Ġend Ġpoint Ġif Ġtrue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġshould Fetch ( data : ĠResult Type ): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS aves Ġretrieved Ġfrom Ġremote Ġinto Ġpersistence Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġsave Remote Data ( response : ĠRequest Type ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrie ved Ġall Ġdata Ġfrom Ġpersistence Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġfetch From Local (): ĠFlow < Result Type > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF etches Ġ[ Response ] Ġfrom Ġthe Ġremote Ġend Ġpoint . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġsuspend Ġfun Ġfetch From Remote (): ĠResult < RequestType > Ċ }