package Ġcom . sol are x soft . kotlin learning Ċ Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠSol are x Ġon Ġ 2 0 2 0 / 4 / 2 8 / 4 : 2 9 ĠPM Ċ Ġ* ĠDesc : Ċ Ġ*/ Ċ data Ġclass ĠGuide Data ( ĊĠĠĠĠĠĠĠ Ġvar Ġnumber : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġtype : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġval Ġpredicate : Ġ(( Boolean ) Ġ-> ĠUnit ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġvar Ġlocked : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġrequest Time : ĠInt Ġ= ĠInt . MAX _ VALUE Ċ ) Ċ Ċ class ĠGuide Queue Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Guide Queue " ĊĠĠĠ Ġprivate Ġval Ġguide Map Ġ= Ġhash Map Of < String , ĠCopy On Write ArrayList < Guide Data >>() ĊĊĠĠĠ Ġfun Ġnext ( token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġguide Map [ token ]?. first OrNull { Ġ! it . locked Ġ&& Ġit . request Time Ġ> Ġ 0 }. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguide Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guide Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ TAG Ġshould Ġreset ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguide Data . locked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguide Data . request Time -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguide Data . predicate . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguide Data . locked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guide Data . request Time Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguide Map [ token ]?. remove ( guide Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenqueue ( token : ĠString , Ġvar arg Ġguide Data : ĠGuide Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġguide Map . get Or Put ( token , Ġ{ Copy On Write ArrayList < Guide Data >() }) ĊĠĠĠĠĠĠĠ Ġfor Ġ( new Guide Ġin Ġguide Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ------------------------- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( new Guide ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( queue . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( new Guide ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" empty Ġ-> Ġ$ queue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġbreak er @{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . forEach Indexed { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , Ġguide Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Guide . number Ġ== Ġguide Data . number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ index Ġnumber Ġequals ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ break er ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Guide . number Ġ< Ġguide Data . number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ index Ġnumber Ġlow ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( index , Ġnew Guide ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ break er ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġqueue . last Index ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ index Ġlast Index ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( new Guide ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ index Ġ-> Ġ$ queue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ enum Ġclass ĠGuide Type ( val Ġdesc : ĠString , Ġval Ġnumber : ĠInt , Ġval Ġrequest Time : ĠInt Ġ= ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠ ĠTYPE _ A (" type _ a ", Ġnumber Ġ= Ġ 1 0 ), ĊĠĠĠ ĠTYPE _ B (" type _ b ", Ġnumber Ġ= Ġ 2 0 ), ĊĠĠĠ ĠTYPE _ C (" type _ c ", Ġnumber Ġ= Ġ 6 0 , Ġrequest Time Ġ= Ġ 1 ) Ċ } Ċ Ċ fun Ġget Guide Data ( guide Type : ĠGuide Type , Ġpredicate : Ġ(( Boolean ) Ġ-> ĠUnit ) Ġ-> ĠUnit ): ĠGuide Data Ġ{ ĊĠĠĠ Ġreturn ĠGuide Data ( guide Type . number , Ġguide Type . desc , Ġpredicate Ġ= Ġpredicate , Ġrequest Time Ġ= Ġguide Type . request Time ) Ċ } Ċ fun Ġtype AP red icate (): (( Boolean ) Ġ-> ĠUnit ) Ġ-> ĠUnit Ġ{ ĊĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠ Ġit . invoke ( false ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġqueue Ġ= ĠGuide Queue () ĊĠĠĠ Ġqueue . enqueue (" hello ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Guide Data ( Guide Type . TYPE _ A , Ġtype AP red icate ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Guide Data ( Guide Type . TYPE _ B , Ġtype AP red icate ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Guide Data ( Guide Type . TYPE _ C , Ġtype AP red icate ()) ĊĠĠĠ Ġ) Ċ }