package Ġorg . hex works . cob alt . databinding . internal . binding čĊč Ċ import Ġkotlinx . collections . immutable . Persistent List č Ċ import Ġorg . hex works . cob alt . databinding . api . C ob alt č Ċ import Ġorg . hex works . cob alt . databinding . api . collection . Observable List č Ċ import Ġorg . hex works . cob alt . databinding . api . event .* č Ċ import Ġorg . hex works . cob alt . databinding . api . extension . map č Ċ import Ġorg . hex works . cob alt . databinding . api . extension . to Property č Ċ import Ġorg . hex works . cob alt . databinding . api . value . Value Validation Result č Ċ import Ġorg . hex works . cob alt . databinding . internal . exception . Circular Binding Exception č Ċ import Ġorg . hex works . cob alt . databinding . internal . extensions . as Internal Property čĊč Ċ @ Suppress (" UN CHECK ED _ CAST ") č Ċ public Ġclass ĠList Binding < S , ĠT >( čĊĠĠĠ Ġsource : ĠObservable List < S >, čĊĠĠĠ Ġconverter : Ġ( S ) Ġ-> ĠT č Ċ ) Ġ: ĠBase Binding < Persistent List < S >, ĠPersistent List < T >>( čĊĠĠĠ Ġsource Ġ= Ġsource , čĊĠĠĠ Ġtarget Ġ= Ġsource . value . map Ġ{ Ġconverter ( it ) Ġ}. to Property (). as Internal Property (), čĊĠĠĠ Ġsubscriptions Ġ= Ġmutable ListOf () č Ċ ) Ġ{ čĊčĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" List Binding " čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġsubscriptions . add ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource . onChange Ġ{ Ġevent Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . trace . any Ġ{ Ġit . emitter Ġ== Ġthis Ġ}) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCircular Binding Exception ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Circular Ġbinding Ġdetected Ġwith Ġtrace Ġ${ event . trace . join ToString ()} Ġfor Ġproperty Ġ$ this . ĠLoop Ġwas Ġprevent ed ." čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġevent . type čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġtarget . value čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaybe NewValue : ĠValue Validation Result < Persistent List < T >> Ġ= Ġtarget . transform Value Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġnot Ġnice ... but Ġthe Ġthing Ġis Ġthat Ġin Ġorder Ġto Ġmake ĠObservable List Ġonly Ġemit ĠList Changes čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġa Ġtype Ġsafe Ġway Ġwe 'd Ġhave Ġto Ġadd Ġit Ġas Ġa Ġtype Ġparameter Ġto Ġthe Ġwhole Ġproperty Ġabstraction čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... which Ġwould Ġalso Ġbreak Ġthe ĠAPI čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( type Ġas ? ĠList Change )?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Add < *> Ġ-> ĠoldValue . add ( converter ( type . element Ġas ĠS )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Add At < *> Ġ-> ĠoldValue . add ( type . index , Ġconverter ( type . element Ġas ĠS )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Remove < *> Ġ-> ĠoldValue . remove ( converter ( type . element Ġas ĠS )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList RemoveAt Ġ-> ĠoldValue . remove At ( type . index ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Set < *> Ġ-> ĠoldValue . set ( type . index , Ġconverter ( type . element Ġas ĠS )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Add All < *> Ġ-> ĠoldValue . addAll ( type . elements . map Ġ{ Ġconverter ( it Ġas ĠS ) Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Add All At < *> Ġ-> ĠoldValue . addAll ( type . index , Ġtype . c . map Ġ{ Ġconverter ( it Ġas ĠS ) Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList RemoveAll < *> Ġ-> ĠoldValue . removeAll ( type . elements . map Ġ{ Ġconverter ( it Ġas ĠS ) Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList RemoveAll When < *> Ġ-> ĠoldValue . removeAll Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( type . predicate Ġas Ġ( T ) Ġ-> ĠBoolean )( it ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Ret ain All < *> Ġ-> ĠoldValue . retain All ( type . elements . map Ġ{ Ġconverter ( it Ġas ĠS ) Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Clear Ġ-> ĠoldValue . clear () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList Property Change < *> Ġ-> ĠoldValue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠoldValue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maybe NewValue . successful Ġ&& ĠoldValue Ġ!= Ġmaybe NewValue . value ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ob alt . event bus . publish ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= ĠObservable ValueChanged ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= ĠoldValue , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= Ġmaybe NewValue . value , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobservable Value Ġ= Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Ġ= Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġevent . type , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Ġ= ĠlistOf ( event ) Ġ+ Ġevent . trace čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Scope Ġ= Ġproperty Scope čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ this :: class . simple Name }( source =$ source , Ġtarget =$ target )" č Ċ } čĊ