/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 , Ġ 2 0 2 0 , Ġ 2 0 2 1 Ġs hed an iel Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġme . s hed an iel . link ie . discord . utils Ċ Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ fun Ġinterface ĠProvider < T Ġ: ĠAny > Ġ{ ĊĠĠĠ Ġfun Ġget (): ĠT Ċ } Ċ Ċ val Ġ< T Ġ: ĠAny > ĠT . provider : ĠProvider < T > ĊĠĠĠ Ġget () Ġ= ĠProvider Ġ{ Ġthis Ġ} Ċ Ċ val Ġ< T Ġ: ĠAny > ĠProvider < T >. lazy : ĠProvider < T > ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġby Ġlazy Ġ{ Ġthis . get () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠProvider Ġ{ Ġvalue Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun Ġ< T Ġ: ĠAny , ĠR Ġ: ĠAny > ĠProvider < T >. map ( mapper : Ġ( T ) Ġ-> ĠR ): ĠProvider < R > Ġ= ĊĠĠĠ ĠProvider Ġ{ Ġmapper ( get ()) Ġ} Ċ Ċ interface ĠProperty < T Ġ: ĠAny > Ġ: ĠProvider < T > Ġ{ ĊĠĠĠ Ġfun Ġset ( value : ĠT ): ĠProperty < T > Ġ= Ġset ( value . provider ) ĊĠĠĠ Ġfun Ġset ( value : ĠProvider < T >): ĠProperty < T > ĊĠĠĠ Ġfun Ġlisten ( listener : Ġ( Provider < T >) Ġ-> ĠUnit ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġcreate (): ĠProperty < T > Ġ= Ġobject Ġ: ĠProperty < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġby ĠDeleg ates . notNull < Provider < T >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisteners Ġ= Ġmutable ListOf <( Provider < T >) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset ( value : ĠProvider < T >): ĠProperty < T > Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . listeners . forEach Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( this . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget (): ĠT Ġ= Ġthis . value . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlisten ( listener : Ġ( Provider < T >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . listeners . add ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġcreate ( initial Value : ĠT ): ĠProperty < T > Ġ= Ġcreate ( initial Value . provider ) ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġcreate ( initial Value : ĠProvider < T >): ĠProperty < T > Ġ= Ġcreate < T >(). set ( initial Value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val Ġ< T Ġ: ĠAny > ĠT . property : ĠProperty < T > ĊĠĠĠ Ġget () Ġ= ĠProperty . create ( this ) Ċ Ċ fun Ġ< T Ġ: ĠAny , ĠR Ġ: ĠAny > ĠProperty < T >. map ( mapper : Ġ( T ) Ġ-> ĠR ): ĠProperty < R > Ġ{ ĊĠĠĠ Ġval Ġproperty : ĠProperty < R > Ġ= ĠProperty . create ( Provider Ġ{ Ġget () Ġ}. map ( mapper ). lazy ) ĊĠĠĠ Ġlisten Ġ{ Ġproperty . set ( it . map ( mapper ). lazy ) Ġ} ĊĠĠĠ Ġreturn Ġproperty Ċ } Ċ