package Ġcom . f ory ou and me . core . arch . flow Ċ Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . map NotNull Ċ Ċ open Ġclass ĠUI Event < T >( private Ġval Ġcontent : ĠT ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġhandle : ĠHandle < T > Ġ= ĠHandle . To Handle ( content ) ĊĠĠĠ Ġprivate Ġvar Ġhandled By : ĠList < String > Ġ= Ġempty List () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcontent Ġand Ġprevents Ġits Ġuse Ġagain . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetContent Once (): ĠHandle < T > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġvalue Ġ= Ġhandle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHandle . To Handle Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHandle . Handled Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhandle Ġ= ĠHandle . Handled () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcontent Ġand Ġprevents Ġits Ġuse Ġagain Ġfrom Ġthe Ġsame Ġhandler . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetContent By Handler ( handler Id : ĠString ): ĠHandle < T > Ġ= ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġvalue Ġ= Ġhandle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHandle . To Handle Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handled By . first OrNull Ġ{ Ġit Ġ== Ġhandler Id Ġ} Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandled By Ġ= Ġhandled By . plus ( handler Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠHandle . Handled () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHandle . Handled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcontent , Ġeven Ġif Ġit 's Ġalready Ġbeen Ġhandled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpeek Content (): ĠT Ġ= Ġcontent ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġtwo Ġevents Ġhave Ġthe Ġsame Ġcontent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhave The Same Content ( other : ĠUI Event < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeek Content () Ġ== Ġother . peek Content () Ċ } Ċ Ċ fun Ġ< T > ĠT . to UI Event () Ġ= ĠUI Event ( this ) ĊĊ Ċ sealed Ġclass ĠHandle < T > Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠTo Handle < T >( val Ġt : ĠT ) Ġ: ĠHandle < T >() ĊĊĠĠĠ Ġclass ĠHand led < T > Ġ: ĠHandle < T >() ĊĊĠĠĠ Ġfun Ġget OrNull (): ĠT ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTo Handle < T > Ġ-> Ġthis . t ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHand led Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠFlow < UI Event < T >> . unwrap Event ( handler Id : ĠString ): ĠFlow < T > Ġ= ĊĠĠĠĠĠĠĠ Ġmap NotNull Ġ{ Ġit . getContent By Handler ( handler Id ). get OrNull () Ġ}