package Ġorg . http 4 k . util . mer ging Ċ Ċ /** Ċ Ġ* ĠThe Ġuse Ġcase Ġfor Ġ[ Merge ] Ġis Ġthat Ġtwo Ġprocesses Ġstarted Ġoff Ġwith Ċ Ġ* Ġan Ġempty Ġ[ reference ] Ġobject , Ġand Ġthen Ġindependently Ġmade Ġsome Ġchanges . Ċ Ġ* ĠNow Ġwe Ġwant Ġto Ġmerge Ġthose Ġchanges Ġback Ġinto Ġa Ġsingle Ġobject Ċ Ġ* Ċ Ġ* ĠFor Ġone Ġfield , Ġwe Ġmight Ġtake Ġthe Ġmost Ġrecent Ġvalue Ġthat Ġhas Ġchanged Ġfrom Ċ Ġ* Ġthe Ġreference Ġversion . ĠFor Ġanother Ġwe Ġmight Ġmerge Ġtwo Ġmaps Ġor Ġtwo Ġlists , Ċ Ġ* Ġand Ġso Ġon Ċ Ġ*/ Ċ data Ġclass ĠMerge < T >( ĊĠĠĠ Ġval Ġreference : ĠT , ĊĠĠĠ Ġval Ġb : ĠT , ĊĠĠĠ Ġval Ġa : ĠT Ċ ) Ġ{ ĊĊĠĠĠ Ġoperator Ġfun Ġ< V > Ġinvoke ( f : ĠMerge < T >. () Ġ-> ĠV ): ĠV Ġ= Ġf ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġvalue Ġof Ġ[ getter ] Ġfrom Ġthe Ġfirst Ġversion Ġwhere ĊĠĠĠĠ Ġ* Ġit Ġis Ġdifferent Ġto Ġ[ reference ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< V > Ġlatest ( getter : Ġ( T ) Ġ-> ĠV ): ĠV Ġ= ĊĠĠĠĠĠĠĠ Ġgetter ( reference ). let Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġa Value Ġ= Ġgetter ( a )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Ġ-> Ġgetter ( b ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġa Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< V > Ġcombine ( getter : Ġ( T ) Ġ-> ĠV , Ġf : Ġ( a : ĠV , Ġb : ĠV ) Ġ-> ĠV ): ĠV Ġ= ĊĠĠĠĠĠĠĠ Ġf ( getter ( a ), Ġgetter ( b )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDr ills Ġdown Ġusing Ġ[ getter ] Ġand Ġgives Ġyou Ġanother Ġ[ Merge ] ĊĠĠĠĠ Ġ* Ġobject Ġfor Ġthe Ġvalue Ġof Ġ[ getter ] Ġin Ġ Ġ[ reference ] Ġvs . ĊĠĠĠĠ Ġ* Ġthe Ġvalue Ġof Ġ[ getter ] Ġin Ġeach Ġof Ġ[ a ] Ġand Ġ[ b ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< V Ġ: ĠAny , ĠR > Ġlatest ( getter : Ġ( T ) Ġ-> ĠV , Ġf : ĠMerge < V >. () Ġ-> ĠR ): ĠR Ġ= ĊĠĠĠĠĠĠĠ Ġgetter ( this . reference ). changes ( getter ( b ), Ġgetter ( a ), Ġf ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDr ills Ġdown Ġusing Ġ[ getter ] Ġand Ġgives Ġyou Ġanother Ġ[ Merge ] ĊĠĠĠĠ Ġ* Ġobject Ġfor Ġthe Ġvalue Ġof Ġ[ getter ] Ġin Ġ[ reference ] Ġvs . ĊĠĠĠĠ Ġ* Ġthe Ġvalue Ġof Ġ[ getter ] Ġin Ġeach Ġof Ġ[ a ] Ġand Ġ[ b ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠYou Ġneed Ġto Ġprovide Ġa Ġ[ null Value ] Ġto Ġbe Ġused Ġas Ġreference ĊĠĠĠĠ Ġ* Ġwhen Ġ[ getter ] Ġis Ġnull Ġin Ġthe Ġexisting Ġ[ reference ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< V Ġ: ĠAny , ĠR > Ġlatest ( getter : Ġ( T ) Ġ-> ĠV ?, Ġnull Value : ĠV , Ġf : ĠMerge < V >. () Ġ-> ĠR ): ĠR ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġgetter ( reference ) Ġ?: Ġnull Value ĊĠĠĠĠĠĠĠ Ġreturn Ġref . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetter ( this . b ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetter ( this . a ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠChanges Ġmade Ġto Ġ[ a ] Ġwill Ġtake Ġpriority Ġover Ġ[ b ] Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny , ĠV > ĠT . changes ( b : ĠT , Ġa : ĠT , Ġf : ĠMerge < T >. () Ġ-> ĠV ) Ġ= ĊĠĠĠ Ġthis . changes ( b , Ġa ). invoke ( f ) Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠT . changes ( b : ĠT , Ġa : ĠT ) Ġ= ĊĠĠĠ ĠMerge ( this , Ġb , Ġa ) Ċ Ċ fun Ġ< T , ĠV > ĠMerge < T >. join ( getter : Ġ( T ) Ġ-> ĠList < V >): ĠList < V > Ġ= ĊĠĠĠ Ġcombine ( getter , Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ}) Ċ Ċ fun Ġ< T , ĠK , ĠV Ġ: ĠAny > ĠMerge < T >. merge ( ĊĠĠĠ Ġgetter : Ġ( T ) Ġ-> ĠMap < K , ĠV >, ĊĠĠĠ Ġnull Value : ĠV , ĊĠĠĠ Ġf : ĠMerge < V >. () Ġ-> ĠV Ċ ): ĠMap < K , ĠV > Ġ{ ĊĠĠĠ Ġval Ġref Map Ġ= Ġgetter ( reference ) ĊĠĠĠ Ġval Ġb Map Ġ= Ġgetter ( b ) ĊĠĠĠ Ġval Ġa Map Ġ= Ġgetter ( a ) ĊĊĠĠĠ Ġreturn Ġ( a Map . keys Ġ+ Ġb Map . keys ). fold ( empty Map ()) Ġ{ Ġacc , Ġk Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġref : ĠV Ġ= Ġref Map [ k ] Ġ?: Ġnull Value ĊĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġref . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Map [ k ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Map [ k ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġacc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġacc Ġ+ Ġ( k Ġto Ġv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T , ĠK , ĠV Ġ: ĠAny > ĠMerge < T >. merge Nullable ( ĊĠĠĠ Ġgetter : Ġ( T ) Ġ-> ĠMap < K , ĠV > ?, ĊĠĠĠ Ġnull Value : ĠV , ĊĠĠĠ Ġf : ĠMerge < V >. () Ġ-> ĠV Ċ ): ĠMap < K , ĠV >? Ġ{ ĊĠĠĠ Ġval Ġref Ġ= Ġgetter ( reference ) Ġ?: Ġempty Map () ĊĠĠĠ Ġval Ġb Ġ= Ġgetter ( b ) ĊĠĠĠ Ġval Ġa Ġ= Ġgetter ( a ) ĊĊĠĠĠ Ġreturn Ġwhen Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġref . changes ( ref , Ġa ). merge ({ Ġit Ġ}, Ġnull Value , Ġf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġref . changes ( b , Ġref ). merge ({ Ġit Ġ}, Ġnull Value , Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġref . changes ( b , Ġa ). merge ({ Ġit Ġ}, Ġnull Value , Ġf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< R , ĠV Ġ: ĠAny > ĠV . resolve ( b : ĠV ?, Ġa : ĠV ?, Ġf : ĠMerge < V >. () Ġ-> ĠR ): ĠR ? Ġ{ ĊĠĠĠ Ġval Ġref Ġ= Ġthis ĊĊĠĠĠ Ġreturn Ġwhen Ġ( b ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ-> Ġwhen Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġref . changes ( ref , Ġa , Ġf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( a ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġref . changes ( b , Ġref , Ġf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġref . changes ( b , Ġa , Ġf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ