package Ġcom . so yle . stories . use case . repositories Ċ Ċ import Ġcom . so yle . stories . domain . character . Character Ċ import Ġcom . so yle . stories . domain . project . Project Ċ import Ġcom . so yle . stories . domain . theme . Symbol Ċ import Ġcom . so yle . stories . domain . theme . Theme Ċ import Ġcom . so yle . stories . domain . theme . op position Value . Opp osition Value Ċ import Ġcom . so yle . stories . domain . theme . value Web . Value Web Ċ import Ġcom . so yle . stories . use case . theme . Theme Repository Ċ import Ġjava . util .* Ċ Ċ class ĠTheme Repository Double ( ĊĠĠĠ Ġprivate Ġval Ġon Add Theme : Ġ( Theme ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġprivate Ġval ĠonUpdate Theme : Ġ( Theme ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġprivate Ġval ĠonDelete Theme : Ġ( Theme ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ: ĠTheme Repository Ġ{ ĊĊĠĠĠ Ġval Ġthemes Ġ= Ġmutable Map Of < Theme . Id , ĠTheme >() ĊĊĠĠĠ Ġfun Ġgiven Theme ( theme : ĠTheme ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthemes [ theme . id ] Ġ= Ġtheme ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġlist Themes In Project ( projectId : ĠProject . Id ): ĠList < Theme > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthemes . values . filter Ġ{ Ġit . projectId Ġ== ĠprojectId Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Theme ById ( id : ĠTheme . Id ): ĠTheme ? Ġ= Ġthemes [ id ] ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Themes ById ( theme Ids : ĠSet < Theme . Id >): ĠSet < Theme > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtheme Ids . map NotNull ( themes :: get ). toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Theme Containing Symbol With Id ( symbol Id : ĠSymbol . Id ): ĠTheme ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthemes . values . find Ġ{ Ġit . symbols . any Ġ{ Ġit . id Ġ== Ġsymbol Id Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Themes Containing Symbols ( symbol Ids : ĠSet < Symbol . Id >): ĠMap < Symbol . Id , ĠTheme > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthemes . values . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġtheme Ġ-> Ġtheme . symbols . as Sequence (). map Ġ{ Ġit . id Ġto Ġtheme Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first Ġin Ġsymbol Ids Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Theme Containing Value Web With Id ( value Web Id : ĠValue Web . Id ): ĠTheme ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthemes . values . find Ġ{ Ġit . value Web s . any Ġ{ Ġit . id Ġ== Ġvalue Web Id Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Theme Containing Opp osition Value With Id ( op position Value Id : ĠO pp osition Value . Id ): ĠTheme ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthemes . values . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Web s . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . op positions . any Ġ{ Ġit . id Ġ== Ġopp osition Value Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Theme Containing Opp osition sWith Symbolic EntityId ( s ymbolic Id : ĠUUID ): ĠList < Theme > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthemes . values . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Web s . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . op positions . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . represent ations . any Ġ{ Ġit . entity UUID Ġ== Ġsymbolic Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd Theme ( theme : ĠTheme ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthemes [ theme . id ] Ġ= Ġtheme ĊĠĠĠĠĠĠĠ Ġon Add Theme ( theme ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Theme ( theme : ĠTheme ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthemes [ theme . id ]= Ġtheme ĊĠĠĠĠĠĠĠ ĠonUpdate Theme ( theme ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Themes ( themes : ĠList < Theme >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthemes . forEach Ġ{ Ġupdate Theme ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Theme ( theme : ĠTheme ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthemes . remove ( theme . id ) ĊĠĠĠĠĠĠĠ ĠonDelete Theme ( theme ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Theme sWith Character Included ( character Id : ĠCharacter . Id ): ĠList < Theme > Ġ= ĊĠĠĠĠĠĠĠ Ġthemes . values . filter Ġ{ Ġit . contains Character ( character Id ) Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Symbol Ids That Do NotExist ( symbol Ids : ĠSet < Symbol . Id >): ĠSet < Symbol . Id > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsymbol Ids Ġ- Ġthemes . values . as Sequence (). flatMap Ġ{ Ġit . symbols . as Sequence () Ġ}. map Ġ{ Ġit . id Ġ}. toSet () ĊĠĠĠ Ġ} Ċ }