package Ġcom . push er . chat kit . curs ors Ċ Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean ĊĊ Ċ class ĠC urs ors Store Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠUser Cursor Store >() ĊĠĠĠ Ġprivate Ġval Ġinitialized Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġoperator Ġfun Ġget ( userId : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ userId ] Ġ?: ĠUser Cursor Store (). also Ġ{ Ġmap [ userId ] Ġ= Ġit Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( userId : ĠString , Ġcursor : ĠCursor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget ( userId ) Ġ+= Ġcursor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( curs ors : ĠList < Cursor >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( cursor Ġin Ġcurs ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ cursor . userId ] Ġ+= Ġcursor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġmap . clear () ĊĠĠĠĠĠĠĠ Ġinitialized . set ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Event ( event : ĠCursor Subscription Event ): ĠList < Cursor Subscription Event > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCursor Subscription Event . InitialState Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġevent . curs ors . map Ġ{ Ġcursor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this [ cursor . userId ][ cursor . roomId ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCursor Subscription Event . No Event ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ cursor . userId ] Ġ+= Ġcursor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCursor Subscription Event . On Cursor Set ( cursor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initialized . get AndSet ( true )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( event . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCursor Subscription Event . On Cursor Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ it . cursor . userId ] Ġ+= Ġit . cursor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠCursor Subscription Event . No Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUser Cursor Store Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcurs ors Ġ= Ġmutable Map Of < String , ĠCursor >() ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( cursor : ĠCursor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurs ors [ cursor . roomId ] Ġ= Ġcursor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( roomId : ĠString ) Ġ= Ġcurs ors [ roomId ] Ċ }