package Ġcom . jetbrains . rd . framework . base Ċ Ċ import Ġcom . jetbrains . rd . framework . Protocol Ċ import Ġcom . jetbrains . rd . framework . impl . Rd Per Context Map Ċ import Ġcom . jetbrains . rd . util . lifetime . Lifetime Ċ import Ġcom . jetbrains . rd . util . reactive .* Ċ import Ġcom . jetbrains . rd . util . trace Ċ Ċ class ĠModel Synchron izer ( val Ġaccepts : Ġ( Any ?) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠProtocol . sub logger (" SYNC ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġclone And Sync ( lf : ĠL ifetime , Ġx : ĠT ): ĠT Ġ= Ġx . deep Clone Pol ymorphic (). also Ġ{ Ġsynchronize Pol ymorphic ( lf , Ġx , Ġit ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġsynchronize ( lifetime : ĠL ifetime , Ġa : ĠIS ign al < T >, Ġb : ĠIS ign al < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġa . flow Into ( lifetime , Ġb ) ĊĠĠĠĠĠĠĠ Ġb . flow Into ( lifetime , Ġa ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġsynchronize ( lifetime : ĠL ifetime , Ġa : ĠI Mutable Property Base < T >, Ġb : ĠI Mutable Property Base < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Sync Is From A To B Ġ= Ġa Ġis ĠIO pt Property View < *> Ġ&& Ġa . hasValue Ġ|| Ġa Ġis ĠI Property View < *> ĊĊĠĠĠĠĠĠĠ Ġif Ġ( initial Sync Is From A To B ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . flow Into ( lifetime , Ġb ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . change . flow Into ( lifetime , Ġa ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . flow Into ( lifetime , Ġa ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . change . flow Into ( lifetime , Ġb ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġsynchronize ( lifetime : ĠL ifetime , Ġa : ĠI Mutable View able Set < T >, Ġb : ĠI Mutable View able Set < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġa . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . add ( clone And Sync ( lifetime , Ġit )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġb . forEach Ġ{ Ġif Ġ(! a . contains ( it )) Ġa . add ( clone And Sync ( lifetime , Ġit )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġa . change . flow Into ( lifetime , Ġb ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġb . change . flow Into ( lifetime , Ġa ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< K Ġ: ĠAny , ĠV Ġ: ĠAny > Ġsynchronize ( lifetime : ĠL ifetime , Ġa : ĠI Mutable View able Map < K , ĠV >, Ġb : ĠI Mutable View able Map < K , ĠV >) Ġ{ ĊĠĠĠĠĠĠĠ Ġa . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb [ it . key ] Ġ= Ġclone And Sync ( lifetime , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġb . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! a . containsKey ( it . key )) Ġa [ it . key ] Ġ= Ġclone And Sync ( lifetime , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġa . change . flow Into ( lifetime , Ġb ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġb . change . flow Into ( lifetime , Ġa ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġsynchronize ( lifetime : ĠL ifetime , Ġa : ĠI Mutable View able List < T >, Ġb : ĠI Mutable View able List < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġb . clear () ĊĊĠĠĠĠĠĠĠ Ġa . flow Into ( lifetime , Ġb ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġb . change . flow Into ( lifetime , Ġa ) Ġ{ Ġclone And Sync ( lifetime , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġsynchronize Immutable Lists ( lifetime : ĠL ifetime , Ġa : ĠList < T >, Ġb : ĠList < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( a . size Ġ== Ġb . size ) Ġ{ Ġ" Collection Ġinitial Ġsizes Ġmust Ġbe Ġequal , Ġbut Ġsizes Ġare Ġdifferent : Ġ${ a . size } Ġ!= Ġ${ b . size }" Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. a . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize Pol ymorphic ( lifetime , Ġa [ i ], Ġb [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġsynchronize Immutable Arrays ( lifetime : ĠL ifetime , Ġa : ĠArray < T >, Ġb : ĠArray < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( a . size Ġ== Ġb . size ) Ġ{ Ġ" Collection Ġinitial Ġsizes Ġmust Ġbe Ġequal , Ġbut Ġsizes Ġare Ġdifferent : Ġ${ a . size } Ġ!= Ġ${ b . size }" Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. a . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize Pol ymorphic ( lifetime , Ġa [ i ], Ġb [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< K Ġ: ĠAny , ĠT Ġ: ĠR d Bind able Base > Ġsynchronize ( lifetime : ĠL ifetime , Ġa : ĠR d Per Context Map < K , ĠT >, Ġb : ĠR d Per Context Map < K , ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġa . view ( lifetime ) Ġ{ Ġlt , Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b . changing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ view ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġb [ key ]?. let Ġ{ Ġother Value Ġ-> Ġsynchronize Pol ymorphic ( lt , Ġvalue , Ġother Value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġa . local Change Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . view ( lifetime ) Ġ{ Ġlt , Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a . changing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ view ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa [ key ]?. let Ġ{ Ġother Value Ġ-> Ġsynchronize Pol ymorphic ( lt , Ġvalue , Ġother Value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġinternal Ġfun Ġsynchronize Pol ymorphic ( lifetime : ĠL ifetime , Ġfirst : ĠAny ?, Ġsecond : ĠAny ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( first Ġ== Ġsecond Ġ|| Ġ! accept s ( first ) Ġ|| Ġ! accept s ( second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( first Ġis ĠR d Delegate Base < *> Ġ&& Ġsecond Ġis ĠR d Delegate Base <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst . deleg ated By . synchron ize With ( lifetime , Ġsecond . deleg ated By ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠIS ign al < *> Ġ&& Ġsecond Ġis ĠIS ign al <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize ( lifetime , Ġfirst Ġas ĠIS ign al < Any >, Ġsecond Ġas ĠIS ign al < Any >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠI Mutable Property Base < *> Ġ&& Ġsecond Ġis ĠI Mutable Property Base <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize ( lifetime , Ġfirst Ġas ĠI Mutable Property Base < Any >, Ġsecond Ġas ĠI Mutable Property Base < Any >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠI Mutable View able List < *> Ġ&& Ġsecond Ġis ĠI Mutable View able List <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize ( lifetime , Ġfirst Ġas ĠI Mutable View able List < Any >, Ġsecond Ġas ĠI Mutable View able List < Any >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠI Mutable View able Set < *> Ġ&& Ġsecond Ġis ĠI Mutable View able Set <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize ( lifetime , Ġfirst Ġas ĠI Mutable View able Set < Any >, Ġsecond Ġas ĠI Mutable View able Set < Any >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠI Mutable View able Map < *, Ġ*> Ġ&& Ġsecond Ġis ĠI Mutable View able Map < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize ( lifetime , Ġfirst Ġas ĠI Mutable View able Map < Any , ĠAny >, Ġsecond Ġas ĠI Mutable View able Map < Any , ĠAny >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠR d Per Context Map < *, Ġ*> Ġ&& Ġsecond Ġis ĠR d Per Context Map < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize ( lifetime , Ġfirst Ġas ĠR d Per Context Map < Any , ĠR d Bind able Base >, Ġsecond Ġas ĠR d Per Context Map < Any , ĠR d Bind able Base >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠR d Bind able Base Ġ&& Ġsecond Ġis ĠR d Bind able Base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst . synchron ize With ( lifetime , Ġsecond ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// collections ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠList < *> Ġ&& Ġsecond Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize Immutable Lists ( lifetime , Ġfirst Ġas ĠList < Any >, Ġsecond Ġas ĠList < Any >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( first Ġis ĠArray < *> Ġ&& Ġsecond Ġis ĠArray <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronize Immutable Arrays ( lifetime , Ġfirst Ġas ĠArray < Any >, Ġsecond Ġas ĠArray < Any >) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Objects Ġare Ġnot Ġmut ually Ġsynchron izable : Ġ 1 ) Ġ$ first ĠĠĠ 2 ) Ġ$ second ") ĊĊĠĠĠĠĠĠĠ Ġlogger . trace Ġ{ Ġ" synchronized Ġ 1 ) Ġ$ first ĠĠĠ 2 ) Ġ$ second " Ġ} ĊĠĠĠ Ġ} Ċ }