package Ġcom . k ro e ger ama . ka ite ki . architecture Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġjava . util . Weak HashMap Ċ Ċ open Ġclass ĠLive Event < T > Ġ: ĠMutable LiveData < T > Ġ{ ĊĠĠĠ Ġconstructor () Ġ: Ġsuper () ĊĠĠĠ Ġconstructor ( value : ĠT ) Ġ: Ġsuper ( value ) ĊĊĠĠĠ Ġprivate Ġval Ġwrappers Ġ= ĠWeak HashMap < Observer < in ĠT >, ĠWrapper < in ĠT >>() ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġobserver : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠWrapper ( observer ) ĊĠĠĠĠĠĠĠ Ġwrappers [ observer ] Ġ= Ġwrapper ĊĠĠĠĠĠĠĠ Ġsuper . observe ( owner , Ġwrapper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġobserve Fore ver ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠWrapper ( observer ) ĊĠĠĠĠĠĠĠ Ġwrappers [ observer ] Ġ= Ġwrapper ĊĠĠĠĠĠĠĠ Ġsuper . observe Fore ver ( wrapper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun Ġremove Observer ( observer : ĠObserver < in ĠT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠObserver < in ĠT > Ġ= Ġif Ġ( observer Ġis ĠWrapper ) Ġobserver . delegate Ġelse Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġwrapper : ĠWrapper < in ĠT >? Ġ= Ġif Ġ( observer Ġis ĠWrapper ) Ġobserver Ġelse Ġwrappers [ observer ] ĊĠĠĠĠĠĠĠ Ġwrappers Ġ-= Ġkey ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . remove Observer ( wrapper ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoverride Ġfun ĠsetValue ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrappers . values . forEach ( Wrapper < in ĠT >:: invalidate ) ĊĠĠĠĠĠĠĠ Ġsuper . setValue ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( value : ĠT ) Ġ= ĠsetValue ( value ) ĊĊĠĠĠ Ġprivate Ġclass ĠWrapper < W >( val Ġdelegate : ĠObserver < W >) Ġ: ĠObserver < W > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpending Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( t : ĠW ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pending ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpending Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . on Changed ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠNotify Live Event Ġ: ĠLive Event < Unit >() Ġ{ ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġoperator Ġfun Ġinvoke () Ġ= ĠsetValue ( Unit ) ĊĊĠĠĠ Ġfun Ġpost () Ġ= Ġpost Value ( Unit ) ĊĊĠĠĠ Ġfun Ġobserve ( owner : ĠLifecycle Owner , Ġobserver : Ġ() Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġobserve ( owner , ĠObserver Ġ{ Ġobserver . invoke () Ġ}) ĊĊĠĠĠ Ġfun Ġobserve Fore ver ( observer : Ġ() Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠ Ġobserve Fore ver ( Observer Ġ{ Ġobserver . invoke () Ġ}) Ċ }