package Ġast miner . common . storage Ċ Ċ type alias ĠId Ġ= ĠLong Ċ Ċ /** Ċ Ġ* ĠThis Ġstorage Ġautomatically Ġassigns Ġeach Ġitem Ġan Ġid Ċ Ġ* Ġand Ġrecords Ġhow Ġmany Ġtimes Ġeach Ġitem Ġhas Ġbeen Ġrecorded Ġin Ġthe Ġstorage . Ċ Ġ* ĠIt Ġranks Ġitems Ġby Ġthe Ġnumber Ġof Ġtimes Ġthey Ġhave Ġbeen Ġrecorded . Ċ Ġ*/ Ċ class ĠRank ed Incremental Id Storage < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġkey Counter Ġ= Ġ 0 L ĊĠĠĠ Ġval Ġid Per Item : ĠMutable Map < T , ĠId > Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġval Ġid Count Map : ĠMutable Map < Id , ĠLong > Ġ= ĠHashMap () ĊĠĠĠ Ġprivate Ġvar Ġid Count R anks : ĠMap < Id , ĠLong >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġput And Increment Key ( item : ĠT ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġid Per Item [ item ] Ġ= Ġ++ key Counter ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Counter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġincrement Id Count ( id : ĠId ) Ġ{ ĊĠĠĠĠĠĠĠ Ġid Count Map [ id ] Ġ= Ġid Count Map . get OrDefault ( id , Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPut s Ġthe Ġitem Ġinto Ġthe Ġstorage Ġor Ġincre ments Ġthe Ġcount Ġof Ġ[ item ] Ġin Ġthe Ġstorage Ġif Ġit Ġis Ġalready Ġpresent . ĊĠĠĠĠ Ġ* Ġ@ param Ġitem ĠThe Ġitem Ġto Ġbe Ġput Ġin Ġthe Ġstorage ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġid Ġof Ġthe Ġrecorded Ġitem ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrecord ( item : ĠT ): ĠId Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġid Per Item [ item ] Ġ?: Ġput And Increment Key ( item ) ĊĠĠĠĠĠĠĠ Ġincrement Id Count ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġid Ġof Ġthe Ġitem Ġif Ġthe Ġitem Ġwas Ġrecorded Ġwith Ġthe Ġrecord ( item ) Ġmethod , Ġreturns Ġ 0 Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetId ( item : ĠT ): ĠLong Ġ= Ġid Per Item [ item ] Ġ?: Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnumber Ġof Ġtimes Ġthe Ġitem Ġwith Ġthe Ġprovided Ġ[ id ] Ġhas Ġbeen Ġrecorded Ġin Ġthe Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetId Count ( id : ĠId ) Ġ= Ġid Count Map . get OrDefault ( id , Ġ 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġitem Ġby Ġits Ġ[ id ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlook Up Value ( id : ĠId ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġid Per Item . entries . first OrNull Ġ{ Ġit . value Ġ== Ġid Ġ} ?. key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġrank Ġof Ġthe Ġ[ item ] ĊĠĠĠĠ Ġ* Ġ@ see ĠgetId Rank ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetKey Rank ( item : ĠT ) Ġ= ĠgetId Rank ( getId ( item )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġrank Ġof Ġthe Ġitem Ġwith Ġthis Ġ[ id ]. ĊĠĠĠĠ Ġ* ĠThe Ġitem Ġthat Ġhas Ġbeen Ġrecorded Ġin Ġthe Ġstorage Ġthe Ġmost Ġtimes Ġhas Ġthe Ġrank Ġ 1 , ĊĠĠĠĠ Ġ* Ġthe Ġsecond Ġmost Ġrecorded Ġitem Ġhas Ġthe Ġrank Ġ 2 , Ġand Ġso Ġon ... ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetId Rank ( id : ĠId ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Count R anks Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompute R anks () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġid Count R anks ?. get ( id ) Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe Ġranks ĊĠĠĠĠ Ġ* Ġ@ see ĠgetId Rank ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcompute R anks () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsorted Ids Ġ= Ġid Count Map . entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġval Ġid Rank Map Ġ= Ġmutable Map Of < Id , ĠLong >() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġid ) Ġin Ġsorted Ids . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Rank Map [ id ] Ġ= Ġ( index Ġ+ Ġ 1 ). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġid Count R anks Ġ= Ġid Rank Map ĊĠĠĠ Ġ} Ċ }