@ file : Suppress (" NOTH ING _ TO _ INLINE ") Ċ Ċ package Ġdev . in mo . micro _ utils . common Ċ Ċ import Ġkotlin . jvm . Jvm Inline Ċ Ċ private Ġinline Ġfun Ġ< T > ĠgetObject ( ĊĠĠĠ Ġadditional : ĠMutable List < T >, ĊĠĠĠ Ġiterator : ĠIterator < T > Ċ ): ĠT ? Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġadditional . isNotEmpty () Ġ-> Ġadditional . remove First () ĊĠĠĠ Ġiterator . hasNext () Ġ-> Ġiterator . next () ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠDiff Ġobject Ġwhich Ġcontains Ġinformation Ġabout Ġdifferences Ġbetween Ġtwo Ġ[ Iterable ] s Ċ Ġ* Ċ Ġ* Ġ@ see Ġcalculate Diff Ċ Ġ*/ Ċ data Ġclass ĠDiff < T > Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġremoved : ĠList < Indexed Value < T >>, ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOld - New Ġvalues Ġpairs ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġreplaced : ĠList < Pair < Indexed Value < T >, ĠIndexed Value < T >> >, ĊĠĠĠ Ġval Ġadded : ĠList < Indexed Value < T >> Ċ ) Ċ Ċ private Ġinline Ġfun Ġ< T > Ġperform Changes ( ĊĠĠĠ Ġpotential Changes : ĠMutable List < Pair < Indexed Value < T > ?, ĠIndexed Value < T >? >>, ĊĠĠĠ Ġadditions In Old : ĠMutable List < T >, ĊĠĠĠ Ġadditions In New : ĠMutable List < T >, ĊĠĠĠ Ġchanged List : ĠMutable List < Pair < Indexed Value < T >, ĠIndexed Value < T >> >, ĊĠĠĠ Ġremoved List : ĠMutable List < Indexed Value < T >>, ĊĠĠĠ Ġadded List : ĠMutable List < Indexed Value < T >>, ĊĠĠĠ Ġstrict Comparison : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġi Ġ= Ġ- 1 ĊĠĠĠ Ġval Ġ( old Object , Ġnew Object ) Ġ= Ġpotential Changes . last OrNull () Ġ?: Ġreturn ĊĠĠĠ Ġfor Ġ(( old , Ġnew ) Ġin Ġpotential Changes . take ( potential Changes . size Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġval Ġold One EqualTo New Object Ġ= Ġold Ġ? . value Ġ=== Ġnew Object Ġ? . value Ġ|| Ġ( old Ġ? . value Ġ== Ġnew Object Ġ? . value Ġ&& Ġ! strict Comparison ) ĊĠĠĠĠĠĠĠ Ġval Ġnew One EqualTo Old Object Ġ= Ġnew Ġ? . value Ġ=== Ġold Object Ġ? . value Ġ|| Ġ( new Ġ? . value Ġ== Ġold Object Ġ? . value Ġ&& Ġ! strict Comparison ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old One EqualTo New Object Ġ|| Ġnew One EqualTo Old Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged List . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpotential Changes . take ( i ). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . first Ġ!= Ġnull Ġ&& Ġit . second Ġ!= Ġnull ) Ġit Ġas ĠPair < Indexed Value < T >, ĠIndexed Value < T >> Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pot entials Ġ= Ġpotential Changes . drop ( i ). take ( potential Changes . size Ġ- Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold One EqualTo New Object Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pot entials . first (). second Ġ? . let Ġ{ Ġadded List . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pot entials . drop ( 1 ). take ( new Pot entials . size Ġ- Ġ 2 ). forEach Ġ{ Ġ( old One , Ġnew One ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded List . add ( new One !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold One Ġ? . let Ġ{ Ġadditions In Old . add ( old One . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Pot entials . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pot entials . last (). first Ġ? . value Ġ? . let Ġ{ Ġadditions In Old . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew One EqualTo Old Object Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pot entials . first (). first Ġ? . let Ġ{ Ġremoved List . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pot entials . drop ( 1 ). take ( new Pot entials . size Ġ- Ġ 2 ). forEach Ġ{ Ġ( old One , Ġnew One ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved List . add ( old One !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew One Ġ? . let Ġ{ Ġadditions In New . add ( new One . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Pot entials . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pot entials . last (). second Ġ? . value Ġ? . let Ġ{ Ġadditions In New . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpotential Changes . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( potential Changes . isNotEmpty () Ġ&& Ġpotential Changes . last (). let Ġ{ Ġit . first Ġ== Ġnull Ġ&& Ġit . second Ġ== Ġnull Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġpotential Changes . drop Last ( 1 ). forEach Ġ{ Ġ( old , Ġnew ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Ġ!= Ġnull Ġ&& Ġnew Ġ!= Ġnull Ġ-> Ġchanged List . add ( old Ġto Ġnew ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Ġ!= Ġnull Ġ-> Ġremoved List . add ( old ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ġ!= Ġnull Ġ-> Ġadded List . add ( new ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCalcul ating Ġ[ Diff ] Ġobject Ċ Ġ* Ċ Ġ* Ġ@ param Ġstrict Comparison ĠIf Ġthis Ġparameter Ġset Ġto Ġtrue , Ġobjects Ġwhich Ġare Ġnot Ġequal Ġby Ġlinks Ġwill Ġbe Ġused Ġas Ġdifferent Ċ Ġ* Ġobjects . ĠFor Ġexample , Ġin Ġcase Ġof Ġtwo Ġ" Example " Ġstring Ġthey Ġwill Ġbe Ġequal Ġby Ġvalue , Ġbut ĠCAN Ġbe Ġdifferent Ġby Ġlinks Ċ Ġ*/ Ċ fun Ġ< T > ĠIterable < T >. calculate Diff ( ĊĠĠĠ Ġother : ĠIterable < T >, ĊĠĠĠ Ġstrict Comparison : ĠBoolean Ġ= Ġfalse Ċ ): ĠDiff < T > Ġ{ ĊĠĠĠ Ġvar Ġi Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġj Ġ= Ġ- 1 ĊĊĠĠĠ Ġval Ġadditional In Old Ġ= Ġmutable ListOf < T >() ĊĠĠĠ Ġval Ġadditional In New Ġ= Ġmutable ListOf < T >() ĊĊĠĠĠ Ġval Ġold Iterator Ġ= Ġiterator () ĊĠĠĠ Ġval Ġnew Iterator Ġ= Ġother . iterator () ĊĊĠĠĠ Ġval Ġpotentially Changed Objects Ġ= Ġmutable ListOf < Pair < Indexed Value < T > ?, ĠIndexed Value < T >? >>() ĊĠĠĠ Ġval Ġchanged Objects Ġ= Ġmutable ListOf < Pair < Indexed Value < T >, ĠIndexed Value < T >> >() ĊĠĠĠ Ġval Ġadded Objects Ġ= Ġmutable ListOf < Indexed Value < T >>() ĊĠĠĠ Ġval Ġremoved Objects Ġ= Ġmutable ListOf < Indexed Value < T >>() ĊĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġj ++ ĊĊĠĠĠĠĠĠĠ Ġval Ġold Object Ġ= ĠgetObject ( additional In Old , Ġold Iterator ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Object Ġ= ĠgetObject ( additional In New , Ġnew Iterator ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( old Object Ġ== Ġnull Ġ&& Ġnew Object Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Object Ġ=== Ġnew Object Ġ|| Ġ( old Object Ġ== Ġnew Object Ġ&& Ġ! strict Comparison ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Objects . addAll ( pot entially Changed Objects . map Ġ{ Ġit Ġas ĠPair < Indexed Value < T >, ĠIndexed Value < T >> Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpotentially Changed Objects . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpotentially Changed Objects . add ( old Object Ġ? . let Ġ{ ĠIndexed Value ( i , Ġold Object ) Ġ} Ġto Ġnew Object Ġ? . let Ġ{ ĠIndexed Value ( j , Ġnew Object ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Old s Add itions Size Ġ= Ġadditional In Old . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious News Add itions Size Ġ= Ġadditional In New . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Changes ( pot entially Changed Objects , Ġadditional In Old , Ġadditional In New , Ġchanged Objects , Ġremoved Objects , Ġadded Objects , Ġstrict Comparison ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ-= Ġ( additional In Old . size Ġ- Ġprevious Old s Add itions Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ-= Ġ( additional In New . size Ġ- Ġprevious News Add itions Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġpotentially Changed Objects . add ( null Ġto Ġnull ) ĊĠĠĠ Ġperform Changes ( pot entially Changed Objects , Ġadditional In Old , Ġadditional In New , Ġchanged Objects , Ġremoved Objects , Ġadded Objects , Ġstrict Comparison ) ĊĊĠĠĠ Ġreturn ĠDiff ( removed Objects . toList (), Ġchanged Objects . toList (), Ġadded Objects . toList ()) Ċ } Ċ inline Ġfun Ġ< T > ĠIterable < T >. diff ( ĊĠĠĠ Ġother : ĠIterable < T >, ĊĠĠĠ Ġstrict Comparison : ĠBoolean Ġ= Ġfalse Ċ ): ĠDiff < T > Ġ= Ġcalculate Diff ( other , Ġstrict Comparison ) Ċ Ċ inline Ġfun Ġ< T > ĠDiff ( old : ĠIterable < T >, Ġnew : ĠIterable < T >) Ġ= Ġold . calculate Diff ( new ) Ċ inline Ġfun Ġ< T > ĠStrict Diff ( old : ĠIterable < T >, Ġnew : ĠIterable < T >) Ġ= Ġold . calculate Diff ( new , Ġtrue ) Ċ Ċ /** Ċ Ġ* ĠThis Ġmethod Ġcall Ġ[ calculate Diff ] Ġwith Ġstrict Ġmode Ġenabled Ċ Ġ*/ Ċ inline Ġfun Ġ< T > ĠIterable < T >. calculate Strict Diff ( ĊĠĠĠ Ġother : ĠIterable < T > Ċ ) Ġ= Ġcalculate Diff ( other , Ġstrict Comparison Ġ= Ġtrue ) Ċ