package Ġnet . cord a . client . j fx . utils Ċ Ċ import Ġjavafx . collections . List ChangeListener Ċ import Ġjavafx . collections . Observable List Ċ import Ġjavafx . collections . transformation . Transformation List Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġa Ġvariant Ġof Ġ[ Easy Bind . map ] Ġwhere Ġthe Ġmapped Ġlist Ġis Ġbacked , Ġtherefore Ġthe Ġmapping Ġfunction Ġwill Ġonly Ġbe Ġrun Ċ Ġ* Ġwhen Ġan Ġelement Ġis Ġinserted Ġor Ġupdated . Ċ Ġ* ĠUse Ġthis Ġinstead Ġof Ġ[ Easy Bind . map ] Ġto Ġtrade Ġoff Ġmemory Ġvs ĠCPU , Ġor Ġif Ġ( god Ġfor bid ) Ġthe Ġmapped Ġfunction Ġis Ġside - effect ing . Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Mapped List < A , ĠB >( list : ĠObservable List < A >, Ġval Ġfunction : Ġ( A ) Ġ-> ĠB ) Ġ: ĠTransformation List < B , ĠA >( list ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbacking List Ġ= ĠArrayList < B >( list . size ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List . add ( function ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsource Changed ( change : ĠList ChangeListener . Change < out ĠA >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Change () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( change . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . was Per mut ated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote Ġhow Ġwe Ġdon 't Ġre - run Ġthe Ġmapping Ġfunction Ġon Ġa Ġpermutation . ĠIf Ġwe Ġsupported Ġmap Indexed Ġwe Ġwould ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġto . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġchange . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġchange . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermutation Ġ= ĠInt Array ( to ) Ġ{ Ġchange . get Per mutation ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġper muted Sub List Ġ= ĠArrayList < B ? >( to Ġ- Ġfrom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper muted Sub List . addAll ( Collections . n Cop ies ( to Ġ- Ġfrom , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 . until ( to Ġ- Ġfrom )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper muted Sub List [ permutation [ from Ġ+ Ġi ]] Ġ= Ġbacking List [ from Ġ+ Ġi ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper muted Sub List . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List [ from Ġ+ Ġi ] Ġ= Ġelement !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Per mutation ( from , Ġto , Ġpermutation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( change . was Updated ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List [ change . from ] Ġ= Ġfunction ( source [ change . from ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Update ( change . from ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . was Removed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremove Position Ġ= Ġchange . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= ĠArrayList < B >( change . removed Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 . until ( change . removed Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved . add ( back ing List . remove At ( remove Position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Remove ( change . from , Ġremoved ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . was Added ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Start Ġ= Ġchange . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd End Ġ= Ġchange . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġadd Start . until ( add End )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbacking List . add ( i , Ġfunction ( change . list [ i ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Add ( add Start , Ġadd End ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġend Change () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( index : ĠInt ) Ġ= Ġbacking List [ index ] ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġbacking List . size ĊĠĠĠ Ġoverride Ġfun Ġget Source Index ( index : ĠInt ) Ġ= Ġindex Ċ } Ċ