package Ġio . smooth . data Ċ Ċ import Ġio . smooth . data . error . recover . Recover Failed Ċ import Ġio . smooth . data . fetch . Fetch Result Ċ import Ġio . smooth . data . fetch . Success Result Ċ import Ġio . smooth . data . fetch . strategy . Fetch Strategy Ċ import Ġio . smooth . data . fetch . strategy . High To Low Fetch Strategy Ċ import Ġio . smooth . data . fetch . strategy . Low To High Fetch Strategy Ċ import Ġio . smooth . data . modify .* Ċ import Ġio . smooth . data . modify . strategy . Low To High Modify Strategy Ċ import Ġio . smooth . data . modify . strategy . Modify Strategy Ċ import Ġio . smooth . data . request . GetRequest Ċ import Ġio . smooth . data . source . DataSource Ċ import Ġio . smooth . data . source . operation . mod ifi ying . Delete Operation Ċ import Ġio . smooth . data . source . operation . mod ifi ying . Modify ing Operation Ċ import Ġio . smooth . data . source . operation . mod ifi ying . Save Operation Ċ import Ġio . smooth . data . source . operation . mod ifi ying . Update Operation Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ abstract Ġclass ĠResourceManager < Request Data , ĠData > Ġ: ĠBase Resource Coordinator < Request Data , ĠData >() Ġ{ ĊĊĠĠĠ Ġsuspend Ġfun Ġfetch ( ĊĠĠĠĠĠĠĠ Ġrequest Data : ĠRequest Data , ĊĠĠĠĠĠĠĠ Ġfetch Strategy : ĠFetch Strategy < Request Data , ĠData > Ġ= ĠLow To High Fetch Strategy (), ĊĠĠĠĠĠĠĠ Ġblock : ĠGet Request < Request Data , ĠData >. () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠFlow < Fetch Result < Request Data , ĠData >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠGet Request ( request Data , Ġfetch Strategy ) ĊĠĠĠĠĠĠĠ Ġblock ( request ) ĊĠĠĠĠĠĠĠ Ġvar Ġflow Ġ= Ġget Operation ( request ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request . ded uplicate Request Ġ&& Ġflow Ġ!= Ġnull ) Ġreturn Ġflow ĊĊĠĠĠĠĠĠĠ Ġflow Ġ= Ġrequest . fetch Strategy . fetch ( request . request Data , Ġget Sources ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed Ġ{ Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . get Same Result Only Once ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( old Ġis ĠSuccess Result < Request Data , ĠData > Ġ&& Ġnew Ġis ĠSuccess Result < Request Data , ĠData >) Ġare Objects The Same ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold . data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. transform Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠSuccess Result < Request Data , ĠData >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate Fetch Result ( request , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . ded uplicate Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Ġ= Ġflow . share In ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope , ĠSh aring Started . While Sub scribed (), Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Operation ( request , Ġflow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġflow !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcoordinate Fetch Result ( ĊĠĠĠĠĠĠĠ Ġget Request : ĠGet Request < Request Data , ĠData >, ĊĠĠĠĠĠĠĠ Ġsuccess Result : ĠSuccess Result < Request Data , ĠData > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġsuccess Result . source ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( getRequest . save Strategy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Strategy . LOWER Ġ-> Ġupdate Lower Sources ( getRequest , Ġsuccess Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Strategy . HIG HER Ġ-> Ġupdate Upper Sources ( getRequest , Ġsuccess Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Strategy . ALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Lower Sources ( getRequest , Ġsuccess Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Upper Sources ( getRequest , Ġsuccess Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Strategy . ONLY _ LOW EST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget First Source ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ!= Ġsource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data In Source IfNeeded ( getRequest , Ġthis , Ġsuccess Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Strategy . ONLY _ HIG HE ST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetLast Source ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġsource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data In Source IfNeeded ( getRequest , Ġthis , Ġsuccess Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġsave ( ĊĠĠĠĠĠĠĠ Ġrequest Data : ĠRequest Data , ĊĠĠĠĠĠĠĠ Ġdata : ĠData , ĊĠĠĠĠĠĠĠ Ġmodify Strategy : ĠModify Strategy < Request Data , ĠData > Ġ= ĠLow To High Modify Strategy (), ĊĠĠĠĠĠĠĠ Ġblock : ĠModify Request < Request Data , ĠData >. () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ= Ġmodify ( request Data , Ġdata , ĠSave Operation :: class , Ġmodify Strategy , Ġblock ) ĊĊĠĠĠ Ġsuspend Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ Ġrequest Data : ĠRequest Data , ĊĠĠĠĠĠĠĠ Ġdata : ĠData ?, ĊĠĠĠĠĠĠĠ Ġmodify Strategy : ĠModify Strategy < Request Data , ĠData > Ġ= ĠLow To High Modify Strategy (), ĊĠĠĠĠĠĠĠ Ġblock : ĠModify Request < Request Data , ĠData >. () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ= Ġmodify ( request Data , Ġdata , ĠUpdate Operation :: class , Ġmodify Strategy , Ġblock ) ĊĊĠĠĠ Ġsuspend Ġfun Ġdelete ( ĊĠĠĠĠĠĠĠ Ġrequest Data : ĠRequest Data , ĊĠĠĠĠĠĠĠ Ġdata : ĠData ?, ĊĠĠĠĠĠĠĠ Ġmodify Strategy : ĠModify Strategy < Request Data , ĠData > Ġ= ĠLow To High Modify Strategy (), ĊĠĠĠĠĠĠĠ Ġblock : ĠModify Request < Request Data , ĠData >. () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ) Ġ= Ġmodify ( request Data , Ġdata , ĠDelete Operation :: class , Ġmodify Strategy , Ġblock ) ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġmodify ( ĊĠĠĠĠĠĠĠ Ġrequest Data : ĠRequest Data , ĊĠĠĠĠĠĠĠ Ġdata : ĠData ?, ĊĠĠĠĠĠĠĠ Ġrequired Operation : ĠK Class < out ĠModify ing Operation < *, Ġ* >>, ĊĠĠĠĠĠĠĠ Ġmodify Strategy : ĠModify Strategy < Request Data , ĠData > Ġ= ĠLow To High Modify Strategy (), ĊĠĠĠĠĠĠĠ Ġblock : ĠModify Request < Request Data , ĠData >. () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠFlow < Modify Result < Request Data , ĠData >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠModify Request ( request Data , Ġdata , Ġrequired Operation ) ĊĠĠĠĠĠĠĠ Ġblock ( request ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġdata To Recover : ĠMap < DataSource < Request Data , ĠData >, ĠData ?> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( request . recover On Fail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata To Recover Ġ= Ġget From Source If Applicable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . required Operation , Ġrequest Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmodify Strategy . modify ( request , Ġget Sources ()). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠFailed Result Ġ&& Ġrequest . recover On Fail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover On Failure ( request , Ġit . source , Ġmodify Strategy . direction (), Ġdata To Recover ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġget From Source If Applicable ( ĊĠĠĠĠĠĠĠ Ġrequired Operation : ĠK Class < out ĠModify ing Operation < *, Ġ* >>, ĊĠĠĠĠĠĠĠ Ġrequest Data : ĠRequest Data ĊĠĠĠ Ġ): ĠMap < DataSource < Request Data , ĠData >, ĠData ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap : ĠMutable Map < DataSource < Request Data , ĠData >, ĠData ?> Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġget Sources (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( required Operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSave Operation :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . save Operation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ it ] Ġ= Ġit . get Operation . get ( request Data ). first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Operation :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . update Operation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ it ] Ġ= Ġit . get Operation . get ( request Data ). first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDelete Operation :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . delete Operation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ it ] Ġ= Ġit . get Operation . get ( request Data ). first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrecover On Failure ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠModify Request < Request Data , ĠData >, Ġfailed Source : ĠDataSource < Request Data , ĠData >, ĊĠĠĠĠĠĠĠ Ġdirection : ĠDirection , ĊĠĠĠĠĠĠĠ Ġdata To Recover : ĠMap < DataSource < Request Data , ĠData >, ĠData ?> ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . UPPER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Source : ĠDataSource < Request Data , ĠData >? Ġ= Ġfailed Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover Data In Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata To Recover ?. get ( current Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Source Ġ= Ġget Upper Source ( current Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LOWER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Source : ĠDataSource < Request Data , ĠData >? Ġ= Ġfailed Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover Data In Source ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Source , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata To Recover ?. get ( current Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Source Ġ= Ġget Lower Source ( current Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . NONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover Data In Source ( request , Ġfailed Source , Ġdata To Recover ?. get ( failed Source )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrecover Data In Source ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠModify Request < Request Data , ĠData >, ĊĠĠĠĠĠĠĠ Ġsource : ĠDataSource < Request Data , ĠData >, ĊĠĠĠĠĠĠĠ Ġdata : ĠData ? ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġopposite Operation : ĠK Class < out ĠModify ing Operation < *, Ġ* >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOP POS ITE _ OPER ATIONS [ request . required Operation ] Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( op pos ite Operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSave Operation :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġthrow ĠRe cover Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . save Operation ?. save ( request . request Data , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate Operation :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġthrow ĠRe cover Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . update Operation ?. update ( request . request Data , Ġnull , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDelete Operation :: class Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . delete Operation ?. delete ( request . request Data , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }