import Ġshared . auth . User Ċ import Ġshared . base . Generic Item Ċ import Ġshared . base . History Ċ import Ġshared . base . History Item Ċ import Ġkotlin . reflect . full . declared Member Properties Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġto Ġhold Ġthe Ġdifferences Ġbetween Ġand Ġitem Ġfrom Ġone Ġstate Ġto Ġanother . Ċ Ġ* Ċ Ġ* Ġ@ param Ġadded ĠThe Ġitems Ġthat Ġwhere Ġadded Ġto Ġthe Ġitem . Ċ Ġ* Ġ@ param Ġremoved ĠThe Ġitems Ġthat Ġwhere Ġremoved Ġfrom Ġthe Ġitem . Ċ Ġ*/ Ċ data Ġclass ĠItem Diff ( val Ġadded : ĠList < Pair < String , ĠAny ? >>, Ġval Ġremoved : ĠList < Pair < String , ĠAny ? >>) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġadded Diff : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġadded . size Ġ- Ġremoved . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( diff Ġ< Ġ 0 ) Ġ 0 Ġelse Ġdiff ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġremoved Diff : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġremoved . size Ġ- Ġadded . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( diff Ġ< Ġ 0 ) Ġ 0 Ġelse Ġdiff ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Pair < String , ĠAny ? >> . map Extras ( diff : ĠInt , Ġupdated By : ĠUser , Ġadded : ĠBoolean Ġ= Ġtrue ): ĠList < History > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġthis . sub List ( this . size Ġ- Ġdiff , Ġthis . size ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġextras . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHistory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġit . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= Ġif Ġ( added ) Ġnull Ġelse Ġit . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= Ġif Ġ( added ) Ġit . second Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated By Ġ= Ġupdated By ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Pair < String , ĠAny ? >> . sorted ( diff : ĠInt ) Ġ= Ġthis . sub List ( 0 , Ġthis . size Ġ- Ġdiff ). sorted By Ġ{ Ġit . first Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġthe Ġ[ added ] Ġand Ġ[ removed ] Ġlists Ġto Ġa Ġco hes ive Ġlist Ġof Ġthe Ġupdates Ġas Ġa Ġlist Ġof Ġ[ History ]. F ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdates ( updated By : ĠUser ): ĠList < History > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġmutable ListOf < History >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( added Diff Ġ> Ġ 0 ) Ġhistory Ġ+= Ġadded . map Extras ( added Diff , Ġupdated By ) ĊĠĠĠĠĠĠĠ Ġif Ġ( removed Diff Ġ> Ġ 0 ) Ġhistory Ġ+= Ġremoved . map Extras ( removed Diff , Ġupdated By , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġadd Sorted Ġ= Ġadded . sorted ( added Diff ) ĊĠĠĠĠĠĠĠ Ġval Ġremove Sorted Ġ= Ġremoved . sorted ( removed Diff ) ĊĊĠĠĠĠĠĠĠ Ġhistory Ġ+= Ġadd Sorted . map Indexed Ġ{ Ġindex , Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove Ġ= Ġremove Sorted [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHistory ( field Ġ= Ġpair . first , ĠoldValue Ġ= Ġremove . second , ĠnewValue Ġ= Ġpair . second , Ġupdated By Ġ= Ġupdated By ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhistory . sorted By Ġ{ Ġit . field Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSpl its Ġthe Ġ[ Generic Item ] Ġgeneric Ġitem Ġin Ġto Ġa Ġlist Ġof Ġits Ġparameters Ġnames Ġand Ġtheir Ġvalues . Ċ Ġ*/ Ċ fun ĠGeneric Item . separate (): ĠList < Pair < String , ĠAny ? >> Ġ{ ĊĠĠĠ Ġval Ġsplit Ġ= Ġmutable ListOf < Pair < String , ĠAny ? >>() ĊĠĠĠ Ġthis . java Class . kotlin . declared Member Properties . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġ== ĠHistory Item :: history . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . name Ġ== Ġ" owner " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . name Ġ== ĠGeneric Item :: date Created . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġit . name Ġ== ĠGeneric Item :: date Updated . name ĊĠĠĠĠĠĠĠ Ġ) Ġreturn @ forEach ĊĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġitem Ġ= Ġit . get ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGeneric Item Ġ-> Ġsplit Ġ+= Ġitem . separate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġitem . filter Is Instance < Generic Item >(). forEach Ġ{ Ġlist Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Item Ġis ĠUser ) Ġsplit . add ( Pair ("${ this :: class . simple Name } Ġ$ id Ġshared User ", Ġlist Item )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsplit Ġ+= Ġlist Item . separate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name Ġ== Ġ" shared Users ") Ġsplit . add ( Pair ("${ this :: class . simple Name } Ġ$ id Ġshared User ", Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsplit . add ( Pair ("${ this :: class . simple Name } Ġ$ id Ġ${ it . name }", Ġitem )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsplit . toList (). sorted By Ġ{ Ġit . first Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDiff 's Ġtwo Ġ[ O ] Ġitems , Ġfor Ġthe Ġ[ user ]. Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Item Diff ], Ġof Ġthe Ġdifferences Ġbetween Ġ[ O ] Ġand Ġ[ other ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠO Ġ: ĠGeneric Item > ĠO . diff ( other : ĠO ): ĠItem Diff Ġ{ ĊĠĠĠ Ġval Ġfirst Item Ġ= Ġthis . separate () ĊĠĠĠ Ġval Ġsecond Item Ġ= Ġother . separate () ĊĊĠĠĠ Ġval Ġremoved Ġ= Ġfirst Item Ġ- Ġsecond Item ĊĠĠĠ Ġval Ġadded Ġ= Ġsecond Item Ġ- Ġfirst Item ĊĊĠĠĠ Ġreturn ĠItem Diff ( added , Ġremoved ) Ċ } Ċ Ċ data Ġclass ĠList Diff < O Ġ: ĠGeneric Item >( val Ġadded : ĠList < O >, Ġval Ġremoved : ĠList < O >, Ġval Ġupdated : ĠList < Int >) Ċ Ċ /** Ċ Ġ* ĠDiff 's Ġtwo Ġ[ O ] Ġitems , Ġfor Ġthe Ġ[ user ]. Ċ Ġ* Ċ Ġ* Ġ@ return Ġ[ Item Diff ], Ġof Ġthe Ġdifferences Ġbetween Ġ[ O ] Ġand Ġ[ other ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠO Ġ: ĠGeneric Item > ĠList < O > ?. diff ( other : ĠList < O >? ): ĠList Diff < O > Ġ{ ĊĠĠĠ Ġval Ġremoved Ġ= Ġthis . diff Lists ( other ) ĊĠĠĠ Ġval Ġadded Ġ= Ġother . diff Lists ( this ) ĊĠĠĠ Ġval Ġupdated Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠ Ġif Ġ( added . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġupdated Ġ+= Ġadded . map NotNull Ġ{ Ġadd Ġ-> Ġremoved . find Ġ{ Ġit . id Ġ== Ġadd . id Ġ} ?. id Ġ}. also Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded . remove If Ġ{ Ġitems . contains ( it . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . remove If Ġ{ Ġitems . contains ( it . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( removed . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġupdated Ġ+= Ġremoved . map NotNull Ġ{ Ġremove Ġ-> Ġadded . find Ġ{ Ġit . id Ġ== Ġremove . id Ġ} ?. id Ġ}. also Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded . remove If Ġ{ Ġitems . contains ( it . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . remove If Ġ{ Ġitems . contains ( it . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠList Diff ( added , Ġremoved , Ġupdated ) Ċ } Ċ Ċ /** Ċ Ġ* ĠUsed Ġinternally Ġto Ġdiff Ġpotentially Ġnullable Ġlists ĠShould Ġnot Ġuse Ġwithin Ġthe Ġapp Ġitself . ĠNeed ing Ġthe Ġre ified Ġclass Ċ Ġ* Ġmakes Ġit Ġaccessible Ġanywhere . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠO Ġ: ĠGeneric Item > ĠList < O > ?. diff Lists ( other : ĠList < O >? ): ĠMutable List < O > Ġ= ĊĠĠĠ Ġ(( this Ġ?: ĠlistOf ()) Ġ- Ġ( other Ġ?: ĠlistOf ())) Ġas ĠMutable List < O > Ċ