package Ġnet . cord a . client . j fx . utils Ċ Ċ import Ġjavafx . beans . value . ChangeListener Ċ import Ġjavafx . beans . value . Observable Value Ċ import Ġjavafx . collections . List ChangeListener Ċ import Ġjavafx . collections . Observable List Ċ import Ġjavafx . collections . transformation . Transformation List Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ[ Flatten edList ] Ġfl att ens Ġthe Ġpassed Ġin Ġlist Ġof Ġ[ Observable Value ] s Ġso Ġthat Ġchanges Ġin Ġindividual Ġupdates Ġto Ġthe Ġvalues Ċ Ġ* Ġare Ġreflected Ġin Ġthe Ġexposed Ġlist Ġas Ġexpected . Ċ Ġ*/ Ċ class ĠFlat ten edList < A >( val Ġsource List : ĠObservable List < out ĠObservable Value < out ĠA >>) Ġ: ĠTransformation List < A , ĠObservable Value < out ĠA >>( source List ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġmaintain Ġan ĠObservable Value -> index Ġmap . ĠThis Ġis Ġneeded Ġbecause Ġwe Ġneed Ġthe ĠObservable Value 's Ġindex Ġin Ġorder Ġto ĊĠĠĠĠ Ġ* Ġpropagate Ġa Ġchange Ġand Ġif Ġthe Ġlistener Ġclosure Ġcaptures Ġthe Ġindex Ġat Ġthe Ġtime Ġof Ġthe Ġcall Ġto ĊĠĠĠĠ Ġ* Ġ[ Observable Value . addListener ] Ġit Ġwill Ġbecome Ġincorrect Ġif Ġthe Ġindices Ġshift Ġaround Ġlater . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġbecause Ġof Ġthe Ġbook keep ing Ġrequired Ġfor Ġthis Ġmap , Ġany Ġremove Ġoperation Ġand Ġany Ġadd Ġoperation Ġthat ĊĠĠĠĠ Ġ* Ġinserts Ġto Ġthe Ġmiddle Ġof Ġthe Ġlist Ġwill Ġbe ĠO ( N ) Ġas Ġwe Ġneed Ġto Ġscan Ġthe Ġmap Ġand Ġshift Ġindices Ġaccordingly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġalso Ġthat Ġwe 're Ġwrapping Ġeach ĠObservable Value , Ġthis Ġis Ġrequired Ġbecause Ġwe Ġwant Ġto Ġsupport Ġre using Ġof ĊĠĠĠĠ Ġ* ĠObservable Values Ġand Ġwe Ġneed Ġeach Ġto Ġhave Ġa Ġdifferent Ġhash . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠWr apped Observable Value < A >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobservable Value : ĠObservable Value < A > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġindex Map Ġ= ĠHashMap < Wrapped Observable Value < out ĠA >, ĠPair < Int , ĠChange Listener < A >> >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsource List . forEach Indexed Ġ{ Ġindex , Ġobservable Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapped Observable Value Ġ= ĠWr apped Observable Value ( observable Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Map [ wrapped Observable Value ] Ġ= ĠPair ( index , Ġcreate Listener ( wrapped Observable Value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Listener ( wrapped : ĠWr apped Observable Value < out ĠA >): ĠChange Listener < A > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠChange Listener < A > Ġ{ Ġ_, ĠoldValue , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentIndex Ġ= Ġindex Map [ wrapped ] !!. first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Change () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Replace ( currentIndex , ĠcurrentIndex Ġ+ Ġ 1 , ĠlistOf ( oldValue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Change () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrapped . observable Value . addListener ( listener ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsource Changed ( c : ĠList ChangeListener . Change < out ĠObservable Value < out ĠA >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Change () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( c . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . was Per mut ated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġc . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġc . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermutation Ġ= ĠInt Array ( to , Ġ{ Ġc . get Per mutation ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Map . replaceAll Ġ{ Ġ_, Ġpair Ġ-> ĠPair ( permutation [ pair . first ], Ġpair . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Per mutation ( from , Ġto , Ġpermutation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c . was Updated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Flatten edList Ġdoesn 't Ġsupport ĠUpdate Ġchanges ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġc . removed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( removed . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġthis Ġassumes Ġthat Ġif Ġwas Added () Ġ== Ġtrue Ġthen Ġwe Ġare Ġadding Ġelements Ġto Ġthe Ġget From () Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove Start Ġ= Ġc . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove Range Ġ= Ġc . removed . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove End Ġ= Ġc . from Ġ+ Ġremove Range ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġindex Map . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġiterator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( wrapped , Ġpair ) Ġ= Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( index , Ġlistener ) Ġ= Ġpair ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġremove Start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġremove End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped . observable Value . remove Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShift Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . setValue ( Pair ( index Ġ- Ġremove Range , Ġlistener )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Remove ( remove Start , Ġremoved . map Ġ{ Ġit . value Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . was Added ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Start Ġ= Ġc . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd End Ġ= Ġc . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Range Ġ= Ġadd End Ġ- Ġadd Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġwas Ġa Ġpush Ġto Ġthe Ġend Ġwe Ġdon 't Ġneed Ġto Ġshift Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Start Ġ!= Ġindex Map . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġindex Map . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġiterator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( index , Ġlistener ) Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġadd Start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShift Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . setValue ( Pair ( index Ġ+ Ġadd Range , Ġlistener )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . added Sub List . forEach Indexed Ġ{ Ġsub list Index , Ġobservable Value Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapped Ġ= ĠWr apped Observable Value ( observable Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Map [ wrapped ] Ġ= ĠPair ( add Start Ġ+ Ġsub list Index , Ġcreate Listener ( wrapped )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Add ( add Start , Ġadd End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġend Change () ĊĠĠĠĠĠĠĠ Ġassert ( source List . size Ġ== Ġindex Map . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( index : ĠInt ) Ġ= Ġsource List . get ( index ). value ĊĊĠĠĠ Ġoverride Ġfun Ġget Source Index ( index : ĠInt ) Ġ= Ġindex ĊĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġsource List . size Ċ } Ċ