package Ġxyz . magenta ize . dynamic data . list . internal Ċ Ċ import Ġxyz . magenta ize . dynamic data . kernel . Optional Ċ import Ġxyz . magenta ize . dynamic data . list .* Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ Ċ internal Ġclass ĠTransformer < T , ĠR >( ĊĠĠĠ Ġprivate Ġval Ġ_ source : ĠObservable < Change Set < T >>, ĊĠĠĠ Ġfactory : Ġ( T , ĠOptional < R >, ĠInt ) Ġ-> ĠR , ĊĠĠĠ Ġprivate Ġval Ġ_ transform On Refresh : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ container Factory : Ġ( T , ĠOptional < R >, ĠInt ) Ġ-> ĠTrans formed Item Container < T , ĠR > Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġitem , Ġprev , Ġindex Ġ-> ĠTrans formed Item Container ( item , Ġfactory ( item , Ġprev , Ġindex )) Ġ} ĊĊĠĠĠ Ġfun Ġrun (): ĠObservable < Change Set < R >> Ġ= ĊĠĠĠĠĠĠĠ Ġ_ source . scan ( Change Aware List < Trans formed Item Container < T , ĠR >> ()) Ġ{ Ġstate , Ġchanges Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( state , Ġchanges ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġscan Ġoperator Ġin Ġrx java Ġwill Ġemit Ġseed Ġas Ġthe Ġfirst Ġitem , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġjust Ġdrop Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanged Ġ= Ġit . capture Changes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged . transform Ġ{ Ġcontainer Ġ-> Ġcontainer . destination Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtransform ( transformed : ĠChange Aware List < Trans formed Item Container < T , ĠR >>, Ġchanges : ĠChange Set < T >) Ġ= ĊĠĠĠĠĠĠĠ Ġchanges . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Ġ= Ġitem . item ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . reason ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Add Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . currentIndex Ġ< Ġ 0 Ġ|| Ġchange . currentIndex Ġ>= Ġtransformed . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . add (_ container Factory ( change . current , ĠOptional . empty (), Ġtransformed . size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Ġ= Ġ_ container Factory ( change . current , ĠOptional . empty (), Ġchange . currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . add ( change . currentIndex , Ġconverted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . AddRange Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġif Ġ( item . range . index Ġ< Ġ 0 ) Ġtransformed . size Ġelse Ġitem . range . index ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . add Or Insert Range ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . range ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġidx , Ġt Ġ-> Ġ_ container Factory ( t , ĠOptional . empty (), Ġidx Ġ+ ĠstartIndex ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . range . index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Refresh Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ transform On Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= ĠOptional . of ( transformed [ change . currentIndex ]. destination ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref reshed Ġ= Ġ_ container Factory ( change . current , Ġprevious , Ġchange . currentIndex ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed [ change . currentIndex ] Ġ= Ġref reshed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . refresh At ( change . currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Replace Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= ĠOptional . of ( transformed [ change . previous Index ]. destination ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . currentIndex Ġ== Ġchange . previous Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed [ change . currentIndex ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ container Factory ( change . current , Ġprevious , Ġchange . currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . remove At ( change . previous Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange . currentIndex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ container Factory ( change . current , ĠOptional . empty (), Ġchange . currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Remove Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . currentIndex Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . remove At ( change . currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġtransformed . first OrNull Ġ{ Ġit . source Ġ=== Ġchange . current Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Remove Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . remove ( to Remove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Remove Range Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . range . index Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . removeAll ( item . range . index , Ġitem . range . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġtransformed . filter Ġ{ Ġt Ġ-> Ġitem . range . any Ġ{ Ġcurrent Ġ-> Ġt . source Ġ=== Ġcurrent Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . remove Many ( to Remove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Clear Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// i . e . Ġneed Ġto Ġstore Ġtransformed Ġreference Ġso Ġwe Ġcan Ġcorrectly Ġc lea ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Clear Ġ= ĠChange ( List Change Reason . Clear , Ġtransformed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . clear Or Remove Many ( to Clear ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Change Reason . Moved Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Index Ġ= Ġchange . currentIndex Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn specified Index Exception (" Cannot Ġmove Ġas Ġan Ġindex Ġwas Ġnot Ġspecified ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed . move ( change . previous Index , Ġchange . currentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġdata Ġclass ĠTrans formed Item Container < T , ĠR >( ĊĠĠĠĠĠĠĠ Ġval Ġsource : ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġdestination : ĠR ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ