package Ġsh mp . simulation . space . resource . container Ċ Ċ import Ġsh mp . simulation . space . resource . Resource Ċ import Ġsh mp . simulation . space . resource . tag . Resource Tag Ċ import Ġjava . util .* ĊĊ Ċ open Ġclass ĠResource Pack Ġprivate Ġconstructor ( resources : ĠCollection < Resource >, Ġdo Safe Add : ĠBoolean ) Ġ{ ĊĠĠĠ Ġprotected Ġvar Ġresource Map Ġ= ĠTreeMap < Resource , ĠResource >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( do Safe Add ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . forEach Ġ{ Ġinternal Add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . forEach { Ġresource Map [ it ] Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( resources : ĠCollection < Resource > Ġ= ĠlistOf ()): Ġthis ( resources , Ġtrue ) ĊĊĠĠĠ Ġval Ġresources : ĠList < Resource > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresource Map . navig able Key Set (). toList () ĊĊĠĠĠ Ġval Ġresources Iterator : ĠIterator < Resource > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresource Map . navig able Key Set (). iterator () ĊĊĠĠĠ Ġval Ġamount : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresource Map . navig able Key Set (). sum By Ġ{ Ġit . amount Ġ} ĊĊĠĠĠ Ġval ĠisEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġamount Ġ== Ġ 0 ĊĊĠĠĠ Ġval Ġis NotEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ! isEmpty ĊĊĠĠĠ Ġ// Ġreturns Ġtrue Ġif Ġresource Ġhas Ġbeen Ġmerged ĊĠĠĠ Ġprotected Ġfun Ġinternal Add ( resource : ĠResource ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resource . amount Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġinternal Ġ= Ġresource Map [ resource ] ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( internal Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Map [ resource ] Ġ= Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal . merge ( resource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Resources Un packed ( predicate : Ġ( Resource ) Ġ-> ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Map . navig able Key Set (). filter ( predicate ) ĊĊĠĠĠ Ġfun Ġget Tagged Resources Un packed ( tag : ĠResource Tag ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Map . navig able Key Set (). filter Ġ{ Ġit . genome . getTag Level ( tag ) Ġ> Ġ 0 Ġ} ĊĊĠĠĠ Ġfun Ġget Resources ( predicate : Ġ( Resource ) Ġ-> ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResource Pack ( getResources Un packed ( predicate ), Ġfalse ) ĊĊĠĠĠ Ġfun ĠgetResource ( resource : ĠResource ): ĠResource Pack Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource In Map Ġ= Ġresource Map [ resource ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠResource Pack () ĊĠĠĠĠĠĠĠ Ġreturn ĠResource Pack ( listOf ( resource In Map ), Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Un packed Resource ( resource : ĠResource ): ĠResource Ġ= Ġresource Map [ resource ] Ġ?: Ġresource . copy ( 0 ) ĊĊĠĠĠ Ġfun Ġget Tag Presence ( tag : ĠResource Tag ) Ġ= Ġget Tagged Resources Un packed ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . getTag Presence ( tag ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sum () ĊĊĠĠĠ Ġfun Ġget Amount ( tag : ĠResource Tag ) Ġ= Ġget Tagged Resources Un packed ( tag ). sum By Ġ{ Ġit . amount Ġ} ĊĊĠĠĠ Ġfun Ġget Amount ( resource : ĠResource ) Ġ= Ġresource Map [ resource ]?. amount Ġ?: Ġ 0 ĊĊĠĠĠ Ġfun Ġget Amount ( predicate : Ġ( Resource ) Ġ-> ĠBoolean ) Ġ= Ġget Resources Un packed ( predicate ). sum By Ġ{ Ġit . amount Ġ} ĊĊĠĠĠ Ġfun Ġclear Empty () Ġ= Ġresource Map . entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . amount Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġresource Map . remove ( it . key ) Ġ} ĊĊĠĠĠ Ġfun Ġany ( predicate : Ġ( Resource ) Ġ-> ĠBoolean ) Ġ= Ġresource Map . navig able Key Set (). any ( predicate ) ĊĊĠĠĠ Ġfun Ġcontains ( resource : ĠResource ) Ġ= Ġresource Map [ resource ] Ġ!= Ġnull ĊĊĠĠĠ Ġfun Ġcontains All ( resources : ĠCollection < Resource >) Ġ= Ġresources . all Ġ{ Ġcontains ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġcontains All ( pack : ĠResource Pack ) Ġ= Ġcontains All ( pack . resource Map . navig able Key Set ()) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource Map . navig able Key Set (). join ToString ("\ n ") Ġ{ Ġ"${ it . fullName } Ġ${ it . amount }; " Ġ} ĊĊĠĠĠ Ġval Ġlist Resources ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresource Map . navig able Key Set (). join ToString Ġ{ Ġ"${ it . fullName } Ġ${ it . amount }; " Ġ} Ċ } Ċ