package Ġcom . cop per leaf . ball ast . repository . cache Ċ Ċ /** Ċ Ġ* ĠA Ġwrapper Ġtype Ġdesigned Ġto Ġbe Ġstored Ġwithin Ġa ĠRepository ĠViewModel Ġand Ġobserved Ġas Ġa ĠFlow Ġin Ġa ĠFragment ĠViewModel , Ċ Ġ* Ġfor Ġfetching Ġdata Ġfrom Ġa Ġremote Ġsource Ġand Ġcaching Ġit Ġin Ġmemory . ĠWhen Ġdata Ġis Ġref reshed , Ġthe Ġprevious Ġvalues Ġare Ġkept Ċ Ġ* Ġaround Ġfor Ġa Ġn icer Ġuser Ġexperience , Ġso Ġthe Ġentire Ġscreen 's Ġdata Ġdoes Ġnot Ġget Ġcleared Ġand Ġre - pop ulated Ġcausing Ċ Ġ* Ġun wanted Ġ" j ank " Ġin Ġthe ĠUI . Ċ Ġ* Ċ Ġ* ĠCached Ġvalues Ġshould Ġonly Ġbe Ġupdated Ġfrom Ġa ĠRepository . ĠTypically , Ġa ĠUI ĠViewModel Ġwill Ġobserve Ġa Ġspecific ĠCached Ċ Ġ* Ġvalue , Ġand Ġthe Ġact Ġof Ġob serving Ġit Ġrequests Ġthe ĠRepository Ġstart Ġloading Ġit . ĠThe ĠUI ĠViewModel Ġis Ġthen Ġjust Ġa Ġpassive Ċ Ġ* Ġobserver Ġof Ġthe Ġstate Ġof Ġthe ĠCached Ġvalue , Ġwhich Ġencaps ulates Ġall Ġthe Ġdata Ġneeded Ġto Ġdecide Ġwhen Ġto Ġshow Ġprogress Ċ Ġ* Ġload ers Ġor Ġsuccess / error Ġstates Ġof Ġthat Ġvalue . ĠWhen Ġa ĠUI ĠViewModel Ġob serves Ġa ĠCached Ġvalue , Ġit Ġshould Ġnot Ġneed Ġany Ċ Ġ* Ġadditional Ġbook keep ing . Ċ Ġ*/ Ċ public Ġsealed Ġclass ĠCached < T Ġ: ĠAny > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġstate Ġof Ġa Ġcached Ġvalue . ĠCached Ġvalues Ġin Ġa ĠViewModel Ġor ĠRepository ĠState Ġshould Ġnever Ġbe Ġnull , Ġbut ĊĠĠĠĠ Ġ* Ġalways Ġinitialized Ġto Ġ[ Cached . Not Loaded ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor cing Ġa Ġrefresh Ġwill Ġreset Ġthe Ġproperty 's Ġstate Ġback Ġto ĠNot Loaded , Ġwhich Ġwill Ġthen Ġcall Ġto Ġthe Ġremote Ġdata ĊĠĠĠĠ Ġ* Ġsource Ġagain . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠNot Loaded < T Ġ: ĠAny >( public Ġval Ġprevious Cached Value : ĠT ? Ġ= Ġnull ) Ġ: ĠCached < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Not Loaded ( previous Cached Value =$ previous Cached Value )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġthat Ġwe Ġhave Ġstarted Ġthe Ġcall Ġto Ġthe Ġremote Ġdata Ġsource , Ġbut Ġit Ġhas Ġnot Ġrespon ded Ġor Ġfailed Ġyet . ĠThe ĊĠĠĠĠ Ġ* Ġ" fetcher " Ġcoroutine Ġis Ġstill Ġactive . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠFetch ing < T Ġ: ĠAny >( public Ġval Ġcached Value : ĠT ?) Ġ: ĠCached < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Fetching ( cached Value =$ cached Value )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġthat Ġthe Ġremote Ġ" fetcher " Ġhas Ġsu cess fully Ġreturned Ġdata Ġand Ġthat Ġthe ĠRepository Ġsuccessfully Ġperformed ĊĠĠĠĠ Ġ* Ġany Ġfollow - up Ġcomputation Ġon Ġthat Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠValue < T Ġ: ĠAny >( public Ġval Ġvalue : ĠT ) Ġ: ĠCached < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Value ( value =$ value )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġthat Ġeither Ġthe Ġremote Ġ" fetcher " Ġfunction Ġitself Ġfailed , Ġor Ġthat Ġit Ġsucceeded Ġbut Ġreturned Ġbad Ġdata ĊĠĠĠĠ Ġ* Ġthat Ġcaused Ġthe ĠRepository Ġto Ġthrow Ġan Ġexception Ġwhen Ġprocessing Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠFetch ing Failed < T Ġ: ĠAny >( public Ġval Ġerror : ĠThrowable , Ġpublic Ġval Ġcached Value : ĠT ?) Ġ: ĠCached < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Fetching Failed ( error =${ error . message }, Ġcached Value =$ cached Value )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ