package eventDemo.business.entity import kotlinx.serialization.Serializable @Serializable @JvmInline value class PlayersHands( private val map: Map> = emptyMap(), ) : Map> by map { constructor(players: Set) : this(players.map { it.id }.associateWith { emptyList() }.toPlayersHands()) fun getHand(player: Player): List? = this[player.id] fun removeCard( player: Player, card: Card, ): PlayersHands = mapValues { (playerId, cards) -> if (playerId == player.id) { if (!cards.contains(card)) error("The hand no contain the card") cards - card } else { cards } }.toPlayersHands() fun addCard( player: Player, newCard: Card, ): PlayersHands = addCards(player, listOf(newCard)) fun addCards( player: Player, newCards: List, ): PlayersHands = mapValues { (p, cards) -> if (p == player.id) { if (cards.intersect(newCards).isNotEmpty()) error("The hand already contain the card") cards + newCards } else { cards } }.toPlayersHands() } fun Map>.toPlayersHands(): PlayersHands = PlayersHands(this)