package Ġde . kotlin Ber lin . k Properties . binding Ċ Ċ import Ġde . kotlin Ber lin . k Properties . property . K Property Ċ import Ġde . kotlin Ber lin . k Properties . util . Weak Reference Ċ import Ġde . kotlin Ber lin . k Properties . value . K ChangeListener Ċ import Ġde . kotlin Ber lin . k Properties . value . K Observable Value Ċ Ċ private Ġclass ĠBid irectional Binding < T , ĠT 1 >( ĊĠĠĠĠĠĠĠ Ġfirst Prop : ĠK Property < T >, ĊĠĠĠĠĠĠĠ Ġsecond Prop : ĠK Property < T 1 >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġto First Mapper : Ġ( T 1 ) Ġ-> ĠT , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġto Second Mapper : Ġ( T ) Ġ-> ĠT 1 Ċ ) Ġ: ĠK ChangeListener < Any ?> Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfirst Property Ref Ġ= ĠWeak Reference ( first Prop ) ĊĊĠĠĠ Ġprivate Ġval Ġsecond Property Ref Ġ= ĠWeak Reference ( second Prop ) ĊĊĠĠĠ Ġprivate Ġvar Ġupdating : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġfirst Prop ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfirst Property Ref . wrapped ĊĊĠĠĠ Ġprivate Ġval Ġsecond Prop ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsecond Property Ref . wrapped ĊĊĠĠĠ Ġoverride Ġfun ĠonChange ( an Observable : ĠK Observable Value < Any ? >, Ġan Old Value : ĠAny ?, Ġa NewValue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp First Prop Ġ= Ġfirst Prop ĊĠĠĠĠĠĠĠ Ġval Ġtemp Second Prop Ġ= Ġsecond Prop ĊĊĠĠĠĠĠĠĠ Ġif Ġ( temp First Prop Ġ== Ġnull Ġ|| Ġtemp Second Prop Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp First Prop ?. remove Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Second Prop ?. remove Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! updating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdating Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp First Prop Ġ== Ġan Observable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Second Prop . value Ġ= Ġto Second Mapper . invoke ( temp First Prop . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp First Prop . value Ġ= Ġto First Mapper . invoke ( temp Second Prop . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Just Ġignore Ġit Ġand Ġkeep Ġold Ġvalue ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdating Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġfirst Prop . hashCode () Ġ+ Ġsecond Prop . hashCode () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( first Prop Ġ== Ġnull Ġ|| Ġsecond Prop Ġ=== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠBid irectional Binding < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other . first Prop Ġ== Ġnull Ġ|| Ġother . second Prop Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Prop Ġ=== Ġother . first Prop Ġ&& Ġsecond Prop Ġ=== Ġother . second Prop ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsecond Prop Ġ=== Ġother . first Prop Ġ&& Ġfirst Prop Ġ=== Ġother . second Prop ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġbid irectional Ġbinding Ġbetween Ġthe Ġtwo Ġ[ K Property ] Ġinstances . Ċ Ġ* Ċ Ġ* Ġ@ see ĠK Property . bind Bid irectional Ċ Ġ*/ Ċ fun Ġ< T > Ġbind Bid irectional ( first Prop : ĠK Property < T >, Ġsecond Prop : ĠK Property < T >) Ġ{ ĊĠĠĠ Ġfirst Prop . value Ġ= Ġsecond Prop . value ĊĠĠĠ Ġval Ġtemp Binding Ġ= ĠBid irectional Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Prop , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Prop , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġ}) ĊĠĠĠ Ġfirst Prop . addListener ( temp Binding ) ĊĠĠĠ Ġsecond Prop . addListener ( temp Binding ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRemoved Ġa Ġbid irectional Ġbinding Ġbetween Ġthe Ġtwo Ġ[ K Property ] Ġinstances . Ċ Ġ* Ċ Ġ* Ġ@ see ĠK Property . unbind Bid irectional Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T , ĠT 1 > Ġun bind Bid irectional ( first Prop : ĠK Property < T >, Ġsecond Prop : ĠK Property < T 1 >) Ġ{ ĊĠĠĠ Ġval Ġtemp Binding Ġ= ĠBid irectional Binding ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Prop , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Prop , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġas ĠT Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit Ġas ĠT 1 Ġ}) ĊĠĠĠ Ġfirst Prop . remove Listener ( temp Binding ) ĊĠĠĠ Ġsecond Prop . remove Listener ( temp Binding ) Ċ }