package Ġkr . ac . sn u . hc il . android . common . events Ċ Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġyo un gh ok im Ġon Ġ 1 6 . Ġ 7 . Ġ 1 1 .. Ċ Ġ* Ċ Ġ* ĠCode s Ġand Ġdesign Ġpatterns Ġfrom Ġhttps :// nv bn . github . io / 2 0 1 6 / 0 4 / 2 8 / kotlin - events / Ċ Ġ* Ċ Ġ*/ Ċ open Ġclass ĠEvent < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġhandlers Ġ= Ġhash Set Of <( sender : ĠAny , Ġargs : ĠT ) Ġ-> ĠUnit >() ĊĠĠĠ Ġprivate Ġvar Ġlisteners Ġ= Ġhash Set Of < I EventListener < T >>() ĊĊĠĠĠ Ġprivate Ġval Ġ_ observable Ġ= ĠPublish Subject . create < Pair < Any , ĠT >>() ĊĊĠĠĠ Ġval Ġobservable : ĠObservable < Pair < Any , ĠT >> Ġget () Ġ= Ġ_ observable ĊĊĠĠĠ Ġvar Ġsuspend : ĠBoolean Ġ= Ġfalse ĊĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( listener : ĠI EventListener < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! listeners . contains ( listener )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( listener : ĠI EventListener < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . remove ( listener ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( handler : Ġ( sender : ĠAny , Ġargs : ĠT ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . add ( handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( handler : Ġ( sender : ĠAny , Ġargs : ĠT ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . remove ( handler ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġinvoke ( sender : ĠAny , Ġargs : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! suspend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( subscriber Ġin Ġhandlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber ( sender , Ġargs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( subscriber Ġin Ġlisteners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . on Event ( sender , Ġargs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ observable . onNext ( Pair ( sender , Ġargs )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandlers . clear () ĊĠĠĠĠĠĠĠ Ġlisteners . clear () ĊĠĠĠ Ġ} Ċ }