package Ġme . kos ert . channel bus Ċ Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels .* Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġholds Ġall Ġbroadcast Ġchannels Ġand Ġhandles Ġevent Ġposting . Ċ Ġ* ĠYou Ġcan Ġuse Ġ[ Global Bus ] Ġthat Ġis Ġjust Ġplain Ġinstance Ġof Ġthis Ġclass Ġor Ġcreate Ġyour Ġown Ġimplementation . Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ @ Experimental Cor outines Api Ċ open Ġclass ĠChannel Bus Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġchannels Ġ= Ġmutable Map Of < Class <* >, ĠBroadcast Channel < Any >>() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġa Ġ[ Broadcast Channel ] Ġfor Ġevents Ġof Ġthe Ġgiven Ġtype . ĠCreates Ġnew Ġchannel Ġif Ġone Ġdoes 't Ġexist . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Broadcast Channel ] Ġfor Ġevents Ġthat Ġare Ġinstances Ġof Ġ[ clazz ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġ< T Ġ: ĠAny > Ġfor Event ( clazz : ĠClass < T >): ĠBroadcast Channel < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchannels . get Or Put ( clazz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCon fl ated Broadcast Channel () ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠBroadcast Channel < T > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPosts Ġnew Ġevent Ġto Ġchannel Ġof Ġthe Ġ[ event ] Ġtype . ĊĠĠĠĠ Ġ* Ġ@ param Ġretain ĠIf Ġthe Ġ[ event ] Ġshould Ġbe Ġretained Ġin Ġthe Ġchannel Ġfor Ġfuture Ġsubscribers . ĠThis Ġis Ġtrue Ġby Ġdefault . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġpost ( event : ĠT , Ġretain : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġfor Event ( event . java Class ) ĊĠĠĠĠĠĠĠ Ġchannel . offer ( event ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Con fl ated Channel Ġcannot Ġtake Ġelement , Ġthis Ġshould Ġnever Ġhappen ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! retain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Event ( event . java Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlast Ġposted Ġevent Ġthat Ġwas Ġinstance Ġof Ġ[ clazz ] Ġor Ġ` null ` Ġif Ġno Ġevent Ġof Ġthe Ġgiven Ġtype Ġis Ġretained . ĊĠĠĠĠ Ġ* Ġ@ return ĠRet ained Ġevent Ġthat Ġis Ġinstance Ġof Ġ[ clazz ] ĊĠĠĠĠ Ġ* Ġ@ see Ġawait Event ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > ĠgetLast Event ( clazz : ĠClass < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġchannels . getOrElse ( clazz ) Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ( channel Ġas ? ĠCon fl ated Broadcast Channel < Any >) ?. value OrNull ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Ġas ? ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġlast Ġposted Ġevent Ġthat Ġwas Ġinstance Ġof Ġ[ clazz ] Ġor Ġawait s Ġfor Ġit Ġif Ġone Ġis Ġnot Ġretained . ĊĠĠĠĠ Ġ* Ġ@ param Ġskip Ret ained ĠSk ips Ġevent Ġretained Ġin Ġthe Ġchannel . ĠThis Ġis Ġ` false ` Ġby Ġdefault ĊĠĠĠĠ Ġ* Ġ@ return ĠNew Ġor Ġretained Ġevent Ġthat Ġis Ġinstance Ġof Ġ[ clazz ] ĊĠĠĠĠ Ġ* Ġ@ see ĠgetLast Event ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġ< T Ġ: ĠAny > Ġawait Event ( clazz : ĠClass < T >, Ġskip Ret ained : ĠBoolean Ġ= Ġfalse ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreceive Channel Ġ= Ġfor Event ( clazz ). open Subscription () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( skip Ret ained ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Channel . poll () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceived Ġ= Ġreceive Channel . receive (). take Unless Ġ{ Ġit Ġis ĠDummy Event Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreceived Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠRemoves Ġretained Ġevent Ġof Ġtype Ġ[ clazz ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdrop Event ( clazz : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! channels . contains ( clazz )) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġchannels [ clazz ] Ġas ĠBroadcast Channel < Any > ĊĠĠĠĠĠĠĠ Ġchannel . offer ( Dummy Event ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠRemoves Ġall Ġretained Ġevents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdrop All () Ġ{ ĊĠĠĠĠĠĠĠ Ġchannels . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . offer ( Dummy Event ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }