diff --git a/src/main/kotlin/eventDemo/app/entity/Deck.kt b/src/main/kotlin/eventDemo/app/entity/Deck.kt index 5b319dc..b3db169 100644 --- a/src/main/kotlin/eventDemo/app/entity/Deck.kt +++ b/src/main/kotlin/eventDemo/app/entity/Deck.kt @@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable @Serializable data class Deck( - val stack: Stack = emptySet(), - val discard: Set = emptySet(), + val stack: Stack = Stack(), + val discard: Discard = Discard(), val playersHands: PlayerHands = emptyMap(), ) { constructor(players: List) : this(playersHands = players.associateWith { emptyList() }) @@ -52,7 +52,7 @@ data class Deck( private fun take(n: Int): Pair> { val takenCards = stack.take(n) - val newStack = stack.filterNot { takenCards.contains(it) }.toSet() + val newStack = stack.filterNot { takenCards.contains(it) }.toStack() return Pair(copy(stack = newStack), takenCards) } @@ -69,7 +69,7 @@ data class Deck( }.let { it + (1..4).map { Card.Plus4Card() } }.shuffled() - .toSet() + .toStack() .let { Deck(it) } } } @@ -82,7 +82,7 @@ fun Deck.initHands( val deckWithEmptyHands = copy(playersHands = players.associateWith { listOf() }) return players.fold(deckWithEmptyHands) { acc: Deck, player: Player -> val hand = acc.stack.take(handSize) - val newStack = acc.stack.filterNot { card: Card -> hand.contains(card) }.toSet() + val newStack = acc.stack.filterNot { card: Card -> hand.contains(card) }.toStack() copy( stack = newStack, playersHands = acc.playersHands.addCards(player, hand), @@ -90,4 +90,30 @@ fun Deck.initHands( } } -typealias Stack = Set +@JvmInline +@Serializable +value class Stack( + val elems: Set = emptySet(), +) : Set by elems { + operator fun plus(card: Card): Stack = elems.plus(card).toStack() + + operator fun minus(card: Card): Stack = elems.minus(card).toStack() +} + +fun List.toStack(): Stack = Stack(this.toSet()) + +fun Set.toStack(): Stack = Stack(this) + +@JvmInline +@Serializable +value class Discard( + val elems: Set = emptySet(), +) : Set by elems { + operator fun plus(card: Card): Discard = elems.plus(card).toDiscard() + + operator fun minus(card: Card): Discard = elems.minus(card).toDiscard() +} + +fun List.toDiscard(): Discard = Discard(this.toSet()) + +fun Set.toDiscard(): Discard = Discard(this)