package Ġcz . c uni . game dev . nail 1 2 3 . utils . collections Ċ Ċ import Ġorg . hex works . cob alt . core . behavior . Dispose State Ċ import Ġorg . hex works . cob alt . core . behavior . Not Disposed Ċ import Ġorg . hex works . cob alt . events . api .* Ċ Ċ /** Ċ Ġ* ĠOwn Ġimplementation Ġof Ġobservable Ġlist , Ġnot ably Ġdifferent Ġin Ġthese Ġaspects Ġfrom ĠDefault List Property Ġof ĠC ob alt : Ċ Ġ* Ġ Ġ- Ġtriggers Ġthe Ġevents Ġimmediately Ġin Ġthe Ġoriginal Ġthread Ċ Ġ* Ġ Ġ- Ġcontains Ġspecific Ġlisteners Ġfor Ġelement Ġadd Ġ/ Ġremove Ċ Ġ* Ġ Ġ- Ġdoesn 't Ġimplicitly Ġuse Ġpersistent Ġlist Ġ( the Ġevents Ġdon 't Ġhave Ġan Ġimmutable Ġvalue Ġas Ġold / new , Ġbut Ġsometimes Ġyou Ċ Ġ* ĠĠĠ Ġdon 't Ġneed Ġthat ) Ċ Ġ*/ Ċ class ĠObservable Map < K , ĠV >( private Ġval Ġmap : ĠMutable Map < K , ĠV > Ġ= Ġmutable Map Of ()): ĠMutable Map < K , ĠV > Ġ{ ĊĠĠĠ Ġdata Ġclass ĠElement Added At < K , ĠV >( override Ġval Ġemitter : ĠObservable Map < K , ĠV >, Ġval Ġindex : ĠK , Ġval Ġelement : ĠV ) Ġ: ĠEvent ĊĠĠĠ Ġdata Ġclass ĠElement Removed At < K , ĠV >( override Ġval Ġemitter : ĠObservable Map < K , ĠV >, Ġval Ġfrom Index : ĠK , Ġval Ġelement : ĠV ) Ġ: ĠEvent ĊĠĠĠ Ġdata Ġclass ĠChanged < K , ĠV >( override Ġval Ġemitter : ĠObservable Map < K , ĠV >) Ġ: ĠEvent ĊĊĠĠĠ Ġobject ĠUn dis posable : ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdispose State : ĠDispose State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠNot Disposed ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose ( dispose State : ĠDispose State ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsize ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmap . size ĊĊĠĠĠ Ġval Ġadd Listeners Ġ= ĠArrayList <( Element Added At < K , ĠV >) Ġ-> ĠCallback Result >() ĊĠĠĠ Ġval Ġremove Listeners Ġ= ĠArrayList <( Element Removed At < K , ĠV >) Ġ-> ĠCallback Result >() ĊĠĠĠ Ġval Ġchange Listeners Ġ= ĠArrayList <( Changed < K , ĠV >) Ġ-> ĠCallback Result >() ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠLIST ENER ĠHAND LING ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFunctions Ġhere Ġallow Ġthe Ġexternal Ġworld Ġto Ġadd Ġ( synchronized ) Ġlisteners Ġwhen Ġthis Ġlist Ġis Ġchanged ĊĠĠĠĠ Ġ* ĠUtility Ġfunctions Ġare Ġprovided Ġfor Ġeasier Ġcreation Ġof Ġlisteners . ĠIn Ġreturn , Ġthey : ĊĠĠĠĠ Ġ* Ġ Ġ- Ġnever Ġdispose Ġof Ġthe Ġsubscription ĊĠĠĠĠ Ġ* Ġ Ġ- Ġimmediately Ġunwrap Ġthe Ġevent Ġclass ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ// ĠPublish ing Ġevents ĊĊĠĠĠ Ġprivate Ġfun Ġvalue Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Listeners . remove If Ġ{ Ġfn Ġ-> Ġfn ( Changed ( this )) Ġ== ĠDispose Subscription Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġadded ( index : ĠK , Ġelement : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Listeners . remove If Ġ{ Ġfn Ġ-> Ġfn ( Element Added At ( this , Ġindex , Ġelement )) Ġ== ĠDispose Subscription Ġ} ĊĠĠĠĠĠĠĠ Ġvalue Changed () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġremoved ( from Index : ĠK , Ġelement : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Listeners . remove If Ġ{ Ġfn Ġ-> Ġfn ( Element Removed At ( this , Ġfrom Index , Ġelement )) Ġ== ĠDispose Subscription Ġ} ĊĠĠĠĠĠĠĠ Ġvalue Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠList ening Ġfor Ġevents ĊĊĠĠĠ Ġprivate Ġfun Ġon Add Inner ( fn : Ġ( Element Added At < K , ĠV >) Ġ-> ĠUnit ): ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Listeners . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeep Subscription ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠUn dis posable ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġon Add Indexed ( fn : Ġ( K , ĠV ) Ġ-> ĠUnit ) Ġ= Ġon Add Inner Ġ{ Ġ(_, Ġindex , Ġelement ) Ġ-> Ġfn ( index , Ġelement ) Ġ} ĊĠĠĠ Ġfun Ġon Add ( fn : Ġ( V ) Ġ-> ĠUnit ) Ġ= Ġon Add Inner Ġ{ Ġ(_, Ġ_, Ġelement ) Ġ-> Ġfn ( element ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Remove Inner ( fn : Ġ( Element Removed At < K , ĠV >) Ġ-> ĠUnit ): ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Listeners . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeep Subscription ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠUn dis posable ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġon Remove Indexed ( fn : Ġ( K , ĠV ) Ġ-> ĠUnit ) Ġ= Ġon Remove Inner Ġ{ Ġ(_, Ġindex , Ġelement ) Ġ-> Ġfn ( index , Ġelement ) Ġ} ĊĠĠĠ Ġfun Ġon Remove ( fn : Ġ( V ) Ġ-> ĠUnit ) Ġ= Ġon Remove Inner Ġ{ Ġ(_, Ġ_, Ġelement ) Ġ-> Ġfn ( element ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonChange Inner ( fn : Ġ( Changed < K , ĠV >) Ġ-> ĠUnit ): ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Listeners . add Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeep Subscription ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠUn dis posable ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠonChange ( fn : Ġ() Ġ-> ĠUnit ) Ġ= ĠonChange Inner Ġ{ Ġ(_) Ġ-> Ġfn () Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠDE LEG ATION ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThese Ġfunction Ġare Ġrequired Ġby Ġthe ĠMap < K , ĠV > Ġinterface Ġand Ġprovide Ġaccess Ġto Ġelements . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġval Ġentries : ĠMutable Set < Mutable Map . Mutable Entry < K , ĠV >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmap . entries ĊĠĠĠ Ġoverride Ġval Ġkeys : ĠMutable Set < K > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmap . keys ĊĠĠĠ Ġoverride Ġval Ġvalues : ĠMutable Collection < V > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmap . values ĊĊĠĠĠ Ġoverride Ġfun Ġcontains Key ( key : ĠK ) Ġ= Ġmap . containsKey ( key ) ĊĠĠĠ Ġoverride Ġfun Ġcontains Value ( value : ĠV ) Ġ= Ġmap . contains Value ( value ) ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġget ( key : ĠK ): ĠV ? Ġ= Ġmap [ key ] ĊĠĠĠ Ġoverride Ġfun ĠisEmpty () Ġ= Ġmap . isEmpty () ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠMUT ABILITY ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFunctions Ġthat Ġprovide Ġmut ability , Ġrequired Ġby Ġthe ĠMutable Map < K , ĠV > Ġinterface ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ= Ġkeys . forEach Ġ{ Ġremove ( it ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġput ( key : ĠK , Ġvalue : ĠV ) Ġ= Ġmap . put ( key , Ġvalue ). also Ġ{ Ġadded ( key , Ġvalue ) Ġ} ĊĠĠĠ Ġoverride Ġfun Ġput All ( from : ĠMap < out ĠK , ĠV >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġfrom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġremove ( key : ĠK ) Ġ= Ġmap . remove ( key ). also Ġ{ Ġif Ġ( it Ġ!= Ġnull Ġ) Ġremoved ( key , Ġit ) Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠOVER RIDE ĠDEFAULT ĠOBJECT ĠMETHO DS ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠObservable Map < *, Ġ*> Ġ&& Ġother . map Ġ== Ġmap ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġmap . hashCode () ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Observable Map ($ map )" Ċ } Ċ Ċ fun Ġ< K , ĠV > Ġobservable Map Of ( var arg Ġelements : ĠPair < K , ĠV >) Ġ= ĠObservable Map ( mutable Map Of (* elements )) Ċ fun Ġ< K , ĠV > ĠObservable Map < K , ĠV >. with Add Listener ( fn : Ġ( V ) Ġ-> ĠUnit ): ĠObservable Map < K , ĠV > Ġ= Ġapply Ġ{ Ġon Add ( fn ) Ġ}