package Ġar cs . storage . api Ċ Ċ import Ġar cs . common . Refer enc able Ċ import Ġar cs . common . Reference Id Ċ import Ġar cs . cr dt . Cr dt Change Ċ import Ġar cs . cr dt . Cr dt Set Ċ import Ġar cs . cr dt . Cr dt Set . Operation . Add Ċ import Ġar cs . cr dt . Cr dt Set . Operation . Fast Forward Ċ import Ġar cs . cr dt . Cr dt Set . Operation . Remove Ċ import Ġar cs . cr dt . internal . Actor Ċ import Ġar cs . cr dt . internal . Version Map Ċ import Ġar cs . data . Collection Type Ċ import Ġar cs . data . Count Type Ċ import Ġar cs . data . EntityType Ċ import Ġar cs . data . Raw Entity Ċ import Ġar cs . data . Schema Ċ import Ġar cs . data . util . Refer enc able Primitive Ċ import Ġar cs . storage . Active Store Ċ import Ġar cs . storage . Ex istence Criteria Ċ import Ġar cs . storage . Proxy Callback Ċ import Ġar cs . storage . Proxy Message Ċ import Ġar cs . storage . Storage Key Ċ import Ġar cs . storage . Storage Mode Ċ import Ġar cs . storage . Store Ċ import Ġar cs . storage . Store Options Ċ import Ġar cs . storage . reference mode . Ref Mode Store Data Ċ import Ġar cs . storage . reference mode . Ref Mode Store Op Ċ import Ġar cs . storage . reference mode . Reference Mode Storage Key Ċ import Ġar cs . util . guard With Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Comp letable Job Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ Ċ /** Ċ Ġ* ĠCreates Ġan Ġ[ Arc s Set ] Ġwhich Ġmanages Ġa Ġset Ġof Ġ[ Raw Entity ] Ġobjects Ġlocated Ġat Ġthe Ġgiven Ċ Ġ* Ġ[ storage Key ], Ġwhose Ġschema e Ġare Ġdefined Ġby Ġthe Ġsupplied Ġ[ schema ]. Ċ Ġ* Ċ Ġ* Ġ** Note :** ĠBy Ġsupply ing Ġyour Ġ[ coroutine Context ], Ġany Ġbindings Ġto Ġthe Ġstorage Ġlayer Ġare Ġreleased Ċ Ġ* Ġwhen Ġthe Ġcontext 's Ġprimary Ġjob Ġis Ġcompleted , Ġthus Ġavoid ing Ġa Ġmemory Ġleak . Ċ Ġ*/ Ċ @ Suppress (" FunctionName ") Ċ @ Experimental Cor outines Api Ċ fun ĠArc s Set ( ĊĠĠĠ Ġstorage Key : ĠReference Mode Storage Key , ĊĠĠĠ Ġschema : ĠSchema , ĊĠĠĠ Ġexistence Criteria : ĠEx istence Criteria Ġ= ĠEx istence Criteria . May Exist , ĊĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= ĠDispatch ers . Default Ċ ): ĠArc s Set < Raw Entity , ĠRef Mode Store Data . Set , ĠRef Mode Store Op . Set > Ġ{ ĊĠĠĠ Ġval Ġstore Opts Ġ= ĠStore Options < Ref Mode Store Data . Set , ĠRef Mode Store Op . Set , ĠSet < Raw Entity >>( ĊĠĠĠĠĠĠĠ Ġstorage Key Ġ= Ġstorage Key , ĊĠĠĠĠĠĠĠ Ġtype Ġ= ĠCollection Type ( EntityType ( schema )), ĊĠĠĠĠĠĠĠ Ġexistence Criteria Ġ= Ġexistence Criteria , ĊĠĠĠĠĠĠĠ Ġmode Ġ= ĠStorage Mode . Reference Mode ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn ĠArc s Set ( ĊĠĠĠĠĠĠĠ Ġstore Ġ= ĠStore ( store Opts ), ĊĠĠĠĠĠĠĠ Ġto Store Data Ġ= Ġ{ ĠRef Mode Store Data . Set ( it ) Ġ}, ĊĠĠĠĠĠĠĠ Ġto Store Op Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdd Ġ-> ĠRef Mode Store Op . Set Add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemove Ġ-> ĠRef Mode Store Op . Set Remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġoperation Ġtype : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġcoroutine Context Ġ= Ġcoroutine Context ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġan Ġ[ Arc s Set ] Ġwhich Ġmanages Ġa Ġset Ġof Ġ[ Refer enc able Primitive ] Ġobjects Ġof Ġtype Ġ< T > Ġlocated Ċ Ġ* Ġat Ġthe Ġgiven Ġ[ storage Key ]. Ċ Ġ* Ċ Ġ* Ġ** Note :** ĠBy Ġsupply ing Ġyour Ġ[ coroutine Context ], Ġany Ġbindings Ġto Ġthe Ġstorage Ġlayer Ġare Ġreleased Ċ Ġ* Ġwhen Ġthe Ġcontext 's Ġprimary Ġjob Ġis Ġcompleted , Ġthus Ġavoid ing Ġa Ġmemory Ġleak . Ċ Ġ*/ Ċ @ Suppress (" FunctionName ") Ċ @ Experimental Cor outines Api Ċ inline Ġfun Ġ< re ified ĠT > ĠArc s Set ( ĊĠĠĠ Ġstorage Key : ĠStorage Key , ĊĠĠĠ Ġexistence Criteria : ĠEx istence Criteria Ġ= ĠEx istence Criteria . May Exist , ĊĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= ĠDispatch ers . Default Ċ ): ĠArc s Set < Refer enc able Primitive < T >, ĊĠĠĠ ĠCr dt Set . Data < Refer enc able Primitive < T >>, ĊĠĠĠ ĠCr dt Set . IO peration < Refer enc able Primitive < T >>> Ġ{ ĊĊĠĠĠ Ġrequire ( Refer enc able Primitive . is Supported Primitive ( T :: class )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Unsupported Ġtype : Ġ${ T :: class }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstore Ops Ġ= ĠStore Options < ĊĠĠĠĠĠĠĠ ĠCr dt Set . Data < Refer enc able Primitive < T >>, ĊĠĠĠĠĠĠĠ ĠCr dt Set . IO peration < Refer enc able Primitive < T >>, ĊĠĠĠĠĠĠĠ ĠSet < Refer enc able Primitive < T >> >( ĊĠĠĠĠĠĠĠ Ġstorage Key Ġ= Ġstorage Key , ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġis Ġwrong . ĠThere Ġshould Ġprobably Ġbe Ġa ĠPrimitive Type ? ĊĠĠĠĠĠĠĠ Ġtype Ġ= ĠCollection Type ( Count Type ()), ĊĠĠĠĠĠĠĠ Ġexistence Criteria Ġ= Ġexistence Criteria , ĊĠĠĠĠĠĠĠ Ġmode Ġ= ĠStorage Mode . Direct ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn ĠArc s Set ( ĊĠĠĠĠĠĠĠ Ġstore Ġ= ĠStore ( store Ops ), ĊĠĠĠĠĠĠĠ Ġto Store Data Ġ= Ġ{ Ġit Ġ}, ĊĠĠĠĠĠĠĠ Ġto Store Op Ġ= Ġ{ Ġit Ġ}, ĊĠĠĠĠĠĠĠ Ġcoroutine Context Ġ= Ġcoroutine Context ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Arc s Set ] Ġis Ġa Ġ[ Mutable Set ]- like Ġdata Ġstructure Ġwhich Ġallows Ġfor Ġeasy Ġinteraction Ġwith Ġ[ Cr dt Set ] s Ċ Ġ* Ġmanaged Ġby ĠArc s ' Ġstorage Ġlayer . Ċ Ġ* Ċ Ġ* ĠAll Ġfunctions Ġon Ġ[ Arc s Set ] Ġare Ġsus pending Ġfunctions , Ġdue Ġto Ġthe Ġfact Ġthat Ġcommunic ating Ġwith Ġthe Ċ Ġ* Ġstorage Ġlayer Ġis Ġan Ġin her ently Ġasynchronous Ġprocess . Ċ Ġ* Ċ Ġ* Ġ** Note :** ĠBy Ġsupply ing Ġyour Ġ[ Coroutine Context ] Ġto Ġthe Ġconstructor , Ġany Ġbindings Ġto Ġthe Ġstorage Ċ Ġ* Ġlayer Ġare Ġreleased Ġwhen Ġthe Ġcontext 's Ġprimary Ġjob Ġis Ġcompleted , Ġthus Ġavoid ing Ġa Ġmemory Ġleak . Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ class ĠArc s Set < T , ĠStore Data , ĠStore Op >( ĊĠĠĠ Ġprivate Ġval Ġstore : ĠStore < Store Data , ĠStore Op , ĠSet < T >>, ĊĠĠĠ Ġprivate Ġval Ġto Store Data : Ġ( Cr dt Set . Data < T >) Ġ-> ĠStore Data , ĊĠĠĠ Ġprivate Ġval Ġto Store Op : Ġ( Cr dt Set . IO peration < T >) Ġ-> ĠStore Op , ĊĠĠĠ Ġcoroutine Context : ĠCor outine Context Ċ ) Ġ: ĠRefer enc able ĊĠĠĠ Ġwhere ĠT Ġ: ĠRefer enc able , ĊĠĠĠĠĠĠĠĠĠ ĠStore Data Ġ: ĠCr dt Set . Data < T >, ĊĠĠĠĠĠĠĠĠĠ ĠStore Op Ġ: ĠCr dt Set . IO peration < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġid : ĠReference Id Ġ= Ġstore . storage Key . toString () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Actor ] Ġthis Ġinstance Ġwill Ġuse Ġwhen Ġperforming ĠCr dt Ġoperations Ġon Ġthe Ġunderlying Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġactor : ĠActor Ġby Ġlazy Ġ{ Ġ" Arc s Set @ ${ hashCode () }" Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcr dt Mutex Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġval Ġcr dt Set Ġby Ġguard With ( cr dt Mutex , ĠCr dt Set < T >()) ĊĠĠĠ Ġprivate Ġvar Ġcached Version Ġby Ġguard With ( cr dt Mutex , ĠVersion Map ()) ĊĠĠĠ Ġprivate Ġvar Ġcached Consumer Data Ġby Ġguard With ( cr dt Mutex , Ġempty Set < T >()) ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( coroutine Context ) ĊĠĠĠ Ġprivate Ġval Ġinitialized : ĠComp letable Job Ġ= ĠJob ( scope . coroutine Context [ Job . Key ]) ĊĠĠĠ Ġprivate Ġvar Ġsync Job : ĠComp letable Job ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcallback Id : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġval Ġactivated Ġ= ĊĠĠĠĠĠĠĠ ĠComp letable Deferred < Active Store < Store Data , ĠStore Op , ĠSet < T >> >( initialized ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġactive Store : ĠActive Store < Store Data , ĠStore Op , ĠSet < T >> ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠLaunch Ġa Ġcoroutine Ġto Ġactivate Ġthe Ġbacking Ġstore , Ġregister Ġourselves Ġas Ġa ĠProxy Callback , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġperform Ġan Ġinitial Ġsync . ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Store Ġ= Ġstore . activate (). also Ġ{ Ġactive Store Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialized . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProxy Callback < Store Data , ĠStore Op , ĠSet < T >> Ġ{ Ġhandle Store Callback ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġcallback Id Ġ= Ġactive Store . on ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivated . complete ( active Store ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync (). join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġow ning Ġscope Ġis Ġfinished , Ġwe Ġshould Ġclean Ġup Ġafter Ġourselves . ĊĠĠĠĠĠĠĠ Ġscope . coroutine Context [ Job . Key ]?. invoke On Completion Ġ{ Ġactive Store ?. off ( callback Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġsnapshot Ġof Ġthe Ġcurrent Ġdata Ġin Ġthe Ġset . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġfreeze (): ĠSet < T > Ġ= Ġcr dt Mutex . with Lock Ġ{ Ġcached Consumer Data Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġan Ġiterator Ġwhich Ġsupports Ġconcurrent ly Ġremoving Ġitems Ġfrom Ġthe Ġset Ġduring Ġiteration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġiterator ( ĊĠĠĠĠĠĠĠ Ġwith Sync : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġscope . coroutine Context ĊĠĠĠ Ġ): ĠS us pending Iterator < T , ĠStore Data , ĠStore Op > Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĠĠĠĠĠĠĠ Ġif Ġ( with Sync ) Ġsync ( coroutine Context ). join () ĊĠĠĠĠĠĠĠ Ġreturn Ġcr dt Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS us pending Iterator ( this , Ġcached Consumer Data . iterator ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġcurrent Ġsize Ġof Ġthe Ġset . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġsize (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĠĠĠĠĠĠĠ Ġreturn Ġcr dt Mutex . with Lock Ġ{ Ġcached Consumer Data . size Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġwhether Ġor Ġnot Ġthe Ġset Ġis Ġempty . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĠĠĠĠĠĠĠ Ġreturn Ġcr dt Mutex . with Lock Ġ{ Ġcached Consumer Data . isEmpty () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġwhether Ġor Ġnot Ġthe Ġset Ġis Ġnon - empty . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġis NotEmpty (): ĠBoolean Ġ= Ġ! isEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġthe Ġ[ element ] Ġto Ġthe Ġset Ġand Ġsus p ends Ġwhile Ġapplying Ġit Ġto Ġthe Ġbacking Ġ[ store ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġor Ġnot Ġthe Ġelement Ġcould Ġbe Ġadded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġadd ( element : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( success , Ġop ) Ġ= Ġcr dt Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Add Op ( element ). let Ġ{ Ġcr dt Set . apply Operation ( it ) Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġupdate Cache () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( success ) Ġapply Operation To Store ( op ) Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLa unches Ġa Ġcoroutine Ġto Ġadd Ġan Ġ[ element ] Ġto Ġthe Ġset Ġand Ġreturns Ġa Ġ[ Deferred ] Ġwhich Ġwill ĊĠĠĠĠ Ġ* Ġresolve Ġto Ġwhether Ġor Ġnot Ġthe Ġelement Ġcould Ġbe Ġadded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġadd Async ( ĊĠĠĠĠĠĠĠ Ġelement : ĠT , ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġscope . coroutine Context ĊĠĠĠ Ġ): ĠDeferred < Boolean > Ġ= Ġscope . async ( coroutine Context ) Ġ{ Ġadd ( element ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġadd Ġall Ġof Ġthe Ġ[ elements ] Ġto Ġthe Ġset Ġand Ġreturns Ġthe Ġnumber Ġof Ġelements Ġwhich ĊĠĠĠĠ Ġ* Ġwere Ġadded Ġsuccessfully . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠS usp ends Ġexecution Ġof Ġthe Ġcurrent Ġcoroutine Ġwhile Ġapplying Ġthe Ġelements Ġto Ġthe Ġbacking ĊĠĠĠĠ Ġ* Ġ[ store ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġadd All ( elements : ĠIterable < T >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĠĠĠĠĠĠĠ Ġval Ġ( count , Ġops ) Ġ= Ġcr dt Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuc cesses Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġops Ġ= Ġmutable ListOf < Add < T >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelements . map Ġ{ Ġmake Add Op ( it ) Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cr dt Set . apply Operation ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuc cesses ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Cache () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuc cesses Ġto Ġops ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcount . also Ġ{ Ġapply Operations To Store ( ops ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLa unches Ġa Ġcoroutine Ġto Ġadd Ġall Ġof Ġthe Ġsupplied Ġ[ elements ] Ġto Ġthe Ġset Ġand Ġreturns Ġa ĊĠĠĠĠ Ġ* Ġ[ Deferred ] Ġwhich Ġresolves Ġto Ġthe Ġnumber Ġof Ġitems Ġwhich Ġwere Ġadded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġadd All Async ( ĊĠĠĠĠĠĠĠ Ġelements : ĠIterable < T >, ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġscope . coroutine Context ĊĠĠĠ Ġ): ĠDeferred < Int > Ġ= Ġscope . async ( coroutine Context ) Ġ{ Ġadd All ( elements ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġspecified Ġ[ element ] Ġfrom Ġthe Ġset Ġand Ġsus p ends Ġexecution Ġwhile Ġthe Ġremoval Ġis ĊĠĠĠĠ Ġ* Ġhappening Ġon Ġthe Ġbacking Ġ[ store ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġor Ġnot Ġthe Ġelement Ġcould Ġbe Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġremove ( element : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( success , Ġop ) Ġ= Ġcr dt Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Remove Op ( element ). let Ġ{ Ġcr dt Set . apply Operation ( it ) Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġupdate Cache () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( success ) Ġapply Operation To Store ( op ) Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLa unches Ġa Ġcoroutine Ġto Ġremove Ġthe Ġspecified Ġ[ element ] Ġfrom Ġthe Ġset Ġ( and Ġthe Ġbacking Ġ[ store ]) ĊĠĠĠĠ Ġ* Ġand Ġreturns Ġa Ġ[ Deferred ] Ġwhich Ġresolves Ġto Ġwhether Ġor Ġnot Ġthe Ġitem Ġcould Ġbe Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġremove Async ( ĊĠĠĠĠĠĠĠ Ġelement : ĠT , ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġscope . coroutine Context ĊĠĠĠ Ġ): ĠDeferred < Boolean > Ġ= Ġscope . async ( coroutine Context ) Ġ{ Ġremove ( element ) Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġwhether Ġor Ġnot Ġthe Ġ[ Arc s Set ] Ġcontains Ġthe Ġgiven Ġ[ item ]. Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġcontains ( item : ĠT , Ġrequire Sync : ĠBoolean Ġ= Ġfalse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġactivated . await () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( require Sync ) Ġsync (). join () ĊĠĠĠĠĠĠĠ Ġreturn Ġcr dt Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Consumer Data . any Ġ{ Ġit . try Dere ference () Ġ== Ġitem Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠInit i ates Ġa Ġsync Ġwith Ġthe Ġbacking Ġstore . Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġsync ( coroutine Context : ĠCor outine Context Ġ= Ġscope . coroutine Context ): ĠJob Ġ= ĊĠĠĠĠĠĠĠ Ġcr dt Mutex . with Lock Ġ{ Ġsync Internal ( coroutine Context ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġa Ġ[ Proxy Message . Sync Request ] Ġto Ġthe Ġproxy . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Note :** ĠMust Ġbe Ġcalled Ġfrom Ġwithin Ġa Ġlock Ġof Ġ[ cr dt Mutex ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsync Internal ( ĊĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġscope . coroutine Context ĊĠĠĠ Ġ): ĠJob Ġ{ ĊĠĠĠĠĠĠĠ Ġsync Job ?. take If Ġ{ Ġit . isActive Ġ} ?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠJob ( coroutine Context [ Job . Key ]). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync Job Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivated . await (). on Proxy Message ( Proxy Message . Sync Request ( callback Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġ[ Cr dt Set . Operation . Add ] Ġoperation Ġto Ġapply Ġto Ġthe Ġlocal Ġ[ cr dt Set ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Note :** ĠMust Ġbe Ġcalled Ġfrom Ġwithin Ġa Ġlock Ġof Ġ[ cr dt Mutex ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmake Add Op ( element : ĠT ): ĠAdd < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Version [ actor ] ++ ĊĠĠĠĠĠĠĠ Ġreturn ĠAdd ( cached Version . copy (), Ġactor , Ġelement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Cr dt Set . Operation . Remove ] Ġoperation Ġto Ġapply Ġto Ġthe Ġlocal Ġ[ cr dt Set ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Note :** ĠMust Ġbe Ġcalled Ġfrom Ġwithin Ġa Ġlock Ġof Ġ[ cr dt Mutex ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmake Remove Op ( element : ĠT ): ĠRemove < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRemove ( cached Version . copy (), Ġactor , Ġelement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġapply Operation To Store ( op : ĠCr dt Set . Operation < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġapply Operations To Store ( listOf ( op )) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġapply Operations To Store ( ops : ĠList < Cr dt Set . Operation < T >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġactivated . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Proxy Message ( Proxy Message . Operations ( ops . map Ġ{ Ġto Store Op ( it ) Ġ}, Ġcallback Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhandle Store Callback ( ĊĠĠĠĠĠĠĠ Ġmessage : ĠProxy Message < Store Data , ĠStore Op , ĠSet < T >> ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Back To Store Ġ= Ġcr dt Mutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( message ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProxy Message . Sync Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProxy Message . Model Update ( to Store Data ( cr dt Set . data ), Ġcallback Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProxy Message . Operations Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Operations Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProxy Message . Model Update Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Model Update Message ( message ). also Ġ{ Ġsync Job ?. complete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġupdate Cache () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Back To Store ?. let Ġ{ Ġactivated . await (). on Proxy Message ( it ) Ġ} Ġ?: Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Model Update Message ( ĊĠĠĠĠĠĠĠ Ġmessage : ĠProxy Message . Model Update < Store Data , ĠStore Op , ĠSet < T >> ĊĠĠĠ Ġ): ĠProxy Message < Store Data , ĠStore Op , ĠSet < T >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġother Changes ) Ġ= Ġcr dt Set . merge ( message . model ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( other Changes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCr dt Change . Operations Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Changes . ops . isNotEmpty () Ġ&& Ġother Changes . ops . has Store Safe Ops ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġsend Ġoperations Ġback Ġto Ġthe Ġactive Store . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProxy Message . Operations ( other Changes . ops . map ( to Store Op ), Ġcallback Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( other Changes . ops . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġother Changes Ġincludes Ġfast - forward Ġops , Ġso Ġlet 's Ġjust Ġsend Ġa Ġmodel Ġupdate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProxy Message . Model Update ( to Store Data ( cr dt Set . data ), Ġcallback Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCr dt Change . Data Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Changes . data Ġ!= Ġcr dt Set . data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġshould Ġbe Ġchanges Ġsent Ġto Ġthe Ġactive Store , Ġsend Ġ' em . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProxy Message . Model Update ( to Store Data ( other Changes . data ), Ġcallback Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Operations Message ( ĊĠĠĠĠĠĠĠ Ġmessage : ĠProxy Message . Operations < Store Data , ĠStore Op , ĠSet < T >> ĊĠĠĠ Ġ): ĠProxy Message < Store Data , ĠStore Op , ĠSet < T >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( message . operations . none Ġ{ Ġ! cr dt Set . apply Operation ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCould n 't Ġapply Ġsome Ġoperations , Ġneed Ġto Ġrequest Ġa Ġsync . ĊĠĠĠĠĠĠĠ Ġreturn ĠProxy Message . Sync Request ( callback Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġ[ cached Version ] Ġand Ġ[ cached Consumer Data ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Note :** ĠThis Ġmay Ġonly Ġbe Ġcalled Ġwhile Ġthe Ġ[ cr dt Mutex ] Ġis Ġlocked . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Version Ġ= Ġcr dt Set . version Map ĊĠĠĠĠĠĠĠ Ġcached Consumer Data Ġ= Ġcr dt Set . consumer View ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Iterator ] Ġover Ġthe Ġcurrent Ġelements Ġof Ġan Ġ[ Arc s Set ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ[ remove Async ] Ġfunction Ġallows Ġfor Ġconcurrent Ġremoval Ġof Ġthe Ġiterator 's Ġcurrent Ġitem Ġfrom ĊĠĠĠĠ Ġ* Ġthe Ġ[ Arc s Set ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠS us pending Iterator < T , ĠStore Data , ĠStore Op > Ġ/* Ġinternal Ġ*/ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparent : ĠArc s Set < T , ĠStore Data , ĠStore Op >, ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbacking Iterator : ĠIterator < T > ĊĠĠĠ Ġ) Ġ: ĠIterator < T > Ġwhere ĠT Ġ: ĠRefer enc able , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStore Data Ġ: ĠCr dt Set . Data < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStore Op Ġ: ĠCr dt Set . IO peration < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent : ĠT ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġbacking Iterator . hasNext () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠT Ġ= Ġbacking Iterator . next (). also Ġ{ Ġcurrent Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRemoves Ġthe Ġiterator 's Ġcurrent Ġelement Ġfrom Ġthe Ġparent Ġ[ Arc s Set ] Ġand Ġreturns Ġa Ġ[ Deferred ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġwhich Ġresolves Ġto Ġwhether Ġor Ġnot Ġthe Ġelement Ġcould Ġbe Ġremoved . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġremove Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġparent . scope . coroutine Context ĊĠĠĠĠĠĠĠ Ġ): ĠDeferred < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġthis . current ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Cannot Ġremove Ġwhen Ġiteration Ġhasn 't Ġbe gun Ġyet ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent . remove Async ( current , Ġcoroutine Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġinternal Ġ*/ Ġsuspend Ġfun Ġsync ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġparent . scope . coroutine Context ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( current Ġ== Ġnull ) Ġ{ Ġ" Sync s Ġmay Ġonly Ġbe Ġperformed Ġbefore Ġiteration Ġhas Ġbe gun " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . sync ( coroutine Context ). join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbacking Iterator Ġ= Ġparent . cr dt Mutex . with Lock Ġ{ Ġparent . cached Consumer Data . iterator () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCollection < Cr dt Set . IO peration < T >> . has Store Safe Ops (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġnone Ġ{ Ġit Ġis ĠFast Forward Ġ} Ċ } Ċ