package Ġorg . hex works . cob alt . databinding . internal . property . base čĊč Ċ import Ġorg . hex works . cob alt . core . extensions . Predicate č Ċ import Ġorg . hex works . cob alt . core . extensions . abbre vi ate č Ċ import Ġorg . hex works . cob alt . core . internal . to Atom č Ċ import Ġorg . hex works . cob alt . core . platform . factory . UUID Factory č Ċ import Ġorg . hex works . cob alt . databinding . api . C ob alt č Ċ import Ġorg . hex works . cob alt . databinding . api . binding . Binding č Ċ import Ġorg . hex works . cob alt . databinding . api . converter . Identity Converter č Ċ import Ġorg . hex works . cob alt . databinding . api . converter . Is omorphic Converter č Ċ import Ġorg . hex works . cob alt . databinding . api . converter . to Converter č Ċ import Ġorg . hex works . cob alt . databinding . api . event . Change Type č Ċ import Ġorg . hex works . cob alt . databinding . api . event . Observable ValueChanged č Ċ import Ġorg . hex works . cob alt . databinding . api . event . Scalar Change č Ċ import Ġorg . hex works . cob alt . databinding . api . property . Property č Ċ import Ġorg . hex works . cob alt . databinding . api . value .* č Ċ import Ġorg . hex works . cob alt . databinding . internal . binding . Bid irectional Binding č Ċ import Ġorg . hex works . cob alt . databinding . internal . binding . Un id irectional Binding č Ċ import Ġorg . hex works . cob alt . databinding . internal . event . Property Scope č Ċ import Ġorg . hex works . cob alt . databinding . internal . exception . Circular Binding Exception č Ċ import Ġorg . hex works . cob alt . databinding . internal . property . Internal Property č Ċ import Ġorg . hex works . cob alt . datat ypes . Maybe č Ċ import Ġorg . hex works . cob alt . events . api . Subscription č Ċ import Ġorg . hex works . cob alt . events . api . simple Subscribe To č Ċ import Ġorg . hex works . cob alt . logging . api . LoggerFactory č Ċ import Ġkotlin . jvm . Synchron ized čĊč Ċ abstract Ġclass ĠBase Property < T Ġ: ĠAny >( čĊĠĠĠ Ġinitial Value : ĠT , čĊĠĠĠ Ġprivate Ġval Ġvalidator : ĠPredicate < T > Ġ= Ġ{ Ġtrue Ġ} č Ċ ) Ġ: ĠInternal Property < T > Ġ{ čĊčĊĠĠĠ Ġoverride Ġvar Ġvalue : ĠT čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbackend . get () čĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value Ġ{ Ġvalue Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġfinal Ġoverride Ġval Ġid Ġ= ĠUUID Factory . randomUUID () čĊĠĠĠ Ġfinal Ġoverride Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this :: class ) čĊĠĠĠ Ġfinal Ġoverride Ġval Ġproperty Scope Ġ= ĠProperty Scope ( id ) čĊčĊĠĠĠ Ġprivate Ġval Ġbackend Ġ= Ġinitial Value . to Atom () čĊĠĠĠ Ġprivate Ġval Ġidentity Converter Ġ= ĠIdentity Converter < T >() čĊčĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Property ( id =${ id . abbre vi ate ()}, Ġvalue =$ value )" čĊčĊĠĠĠ Ġoverride Ġfun Ġupdate Value ( newValue : ĠT ): ĠValue Validation Result < T > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġtransform Value Ġ{ ĠnewValue Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") čĊĠĠĠ Ġoverride Ġfun Ġtransform Value ( transformer : Ġ( oldValue : ĠT ) Ġ-> ĠT ): ĠValue Validation Result < T > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue Validation Successful ( update Current Value ( fn Ġ= Ġtransformer )) čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠValue Validation FailedException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠValue Validation Failed ( e . newValue Ġas ĠT , Ġe ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġoverride Ġfun ĠonChange ( fn : Ġ( Observable ValueChanged < T >) Ġ-> ĠUnit ): ĠSubscription Ġ{ čĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Sub scri bing Ġto Ġchanges Ġto Ġproperty : Ġ$ this ." Ġ} čĊĠĠĠĠĠĠĠ Ġreturn ĠC ob alt . event bus . simple Subscribe To < Observable ValueChanged < T >>( property Scope ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( it ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġbind ( other : ĠProperty < T >, Ġupdate When Bound : ĠBoolean ): ĠBinding < T > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġbind ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġ= Ġother , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate When Bound Ġ= Ġupdate When Bound , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Ġ= Ġidentity Converter čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġ< S Ġ: ĠAny > Ġbind ( čĊĠĠĠĠĠĠĠ Ġother : ĠProperty < S >, čĊĠĠĠĠĠĠĠ Ġupdate When Bound : ĠBoolean , čĊĠĠĠĠĠĠĠ Ġconverter : ĠIs omorphic Converter < S , ĠT > čĊĠĠĠ Ġ): ĠBinding < T > Ġ{ čĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Binding Ġproperty Ġ$ this Ġto Ġother Ġproperty Ġ$ other ." Ġ} čĊĠĠĠĠĠĠĠ Ġcheck Self Binding ( other ) čĊĠĠĠĠĠĠĠ Ġother Ġas ? ĠInternal Property < S > Ġ?: Ġerror (" Can Ġonly Ġbind ĠProperties Ġwhich Ġimplement ĠInternal Property .") čĊĠĠĠĠĠĠĠ Ġif Ġ( update When Bound ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value Ġ{ Ġconverter . convert ( other . value ) Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn ĠBid irectional Binding ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġother , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Ġ= Ġconverter čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġupdate From ( čĊĠĠĠĠĠĠĠ Ġobservable : ĠObservable Value < T >, čĊĠĠĠĠĠĠĠ Ġupdate When Bound : ĠBoolean čĊĠĠĠ Ġ): ĠBinding < T > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġupdate From ( observable , Ġupdate When Bound ) Ġ{ Ġit Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġ< S Ġ: ĠAny > Ġupdate From ( čĊĠĠĠĠĠĠĠ Ġobservable : ĠObservable Value < S >, čĊĠĠĠĠĠĠĠ Ġupdate When Bound : ĠBoolean , čĊĠĠĠĠĠĠĠ Ġconverter : Ġ( S ) Ġ-> ĠT čĊĠĠĠ Ġ): ĠBinding < T > Ġ{ čĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Starting Ġto Ġupdate Ġproperty Ġ$ this Ġfrom Ġ$ observable ." čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġcheck Self Binding ( observable ) čĊĠĠĠĠĠĠĠ Ġif Ġ( update When Bound ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Current Value Ġ{ Ġconverter ( observable . value ) Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn ĠUn id irectional Binding ( observable , Ġthis , Ġconverter . to Converter ()) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġupdate With Event ( čĊĠĠĠĠĠĠĠ ĠoldValue : ĠT , čĊĠĠĠĠĠĠĠ ĠnewValue : ĠT , čĊĠĠĠĠĠĠĠ Ġevent : ĠObservable ValueChanged < Any > čĊĠĠĠ Ġ): ĠBoolean Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Trying Ġto Ġupdate Ġ$ this Ġusing Ġevent Ġ$ event Ġwith Ġnew Ġvalue Ġ$ newValue ." čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġtrick Ġenables Ġthe Ġwhole Ġsystem Ġnot Ġto Ġcrash Ġif Ġthere Ġis Ġa Ġcircular Ġdependency čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 ." čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġevent ToSend Ġ= ĠMaybe . empty < Observable ValueChanged < T >>() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackend . transform Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( validator ( newValue ). not ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValue Validation FailedException ( newValue , Ġ" The Ġgiven Ġvalue Ġ'$ newValue ' Ġis Ġinvalid .") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ!= ĠnewValue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ToSend Ġ= ĠMaybe . of ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable ValueChanged ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= ĠoldValue , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= ĠnewValue , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobservable Value Ġ= Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Ġ= Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Ġ= ĠlistOf ( event ) Ġ+ Ġevent . trace čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ToSend . map Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Old Ġvalue Ġ$ oldValue Ġof Ġ$ this Ġdiffers Ġfrom Ġnew Ġvalue Ġ$ newValue , Ġf iring Ġchange Ġevent ." čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ob alt . event bus . publish ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= Ġit , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Scope Ġ= Ġproperty Scope čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCircular Binding Exception ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Bound ĠProperty Ġwas Ġnot Ġupdated Ġdue Ġto Ġcircular Ġdependency : Ġ${ e . message }") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// ĠThis Ġwon 't Ġlead Ġto Ġa Ġdead lock Ġin Ġcase Ġwe Ġtry Ġto Ġset Ġthe Ġvalue Ġtwice Ġin Ġcase Ġof Ġa čĊĠĠĠ Ġ// Ġcircular Ġdependency , Ġbecause Ġwe Ġalready Ġhave Ġthe Ġmonitor . čĊĠĠĠ Ġ@ Synchron ized čĊĠĠĠ Ġprotected Ġopen Ġfun Ġupdate Current Value ( type : ĠChange Type Ġ= ĠScalar Change , Ġfn : Ġ( T ) Ġ-> ĠT ): ĠT Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġevent ToSend Ġ= ĠMaybe . empty < Observable ValueChanged < T >>() čĊĠĠĠĠĠĠĠ Ġbackend . transform Ġ{ ĠoldValue Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġfn ( oldValue ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( validator ( newValue ). not ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠValue Validation FailedException ( newValue , Ġ" The Ġgiven Ġvalue Ġ$ newValue Ġis Ġinvalid .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ!= ĠnewValue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ToSend Ġ= ĠMaybe . of ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable ValueChanged ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoldValue Ġ= ĠoldValue , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Ġ= ĠnewValue , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobservable Value Ġ= Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter Ġ= Ġthis čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġevent ToSend . map Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Old Ġvalue Ġ${ it . oldValue } Ġof Ġ$ this Ġdiffers Ġfrom Ġnew Ġvalue Ġ${ it . newValue }, Ġf iring Ġchange Ġevent ." čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ ĠC ob alt . event bus . publish ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Ġ= Ġit , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Scope Ġ= Ġproperty Scope čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġbackend . get () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun Ġcheck Self Binding ( other : ĠObservable Value < Any >) Ġ{ čĊĠĠĠĠĠĠĠ Ġrequire ( this Ġ!== Ġother ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can 't Ġbind Ġa Ġproperty Ġto Ġitself ." čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊ