From 222d4375ee9c5728b028fe5bde27249aa9912c3a Mon Sep 17 00:00:00 2001 From: Kistaro Windrider Date: Sat, 1 Apr 2023 19:31:50 -0700 Subject: [PATCH] deck.Strip -- remove cards Given a function that identifies cards to remove, remove them from the deck. This can be used to find and strip out cards that are only conditionally appropriate (and aren't appropriate anymore). --- cardsim/deck.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/cardsim/deck.go b/cardsim/deck.go index 28214a6..b888150 100644 --- a/cardsim/deck.go +++ b/cardsim/deck.go @@ -264,9 +264,33 @@ func (d *Deck[C]) ShuffleTop(frac float64) error { return d.ShuffleRange(0.0, frac) } -// Shufflebottom uses ShuffleRange to shuffle the bottom frac (between 0.0 and +// ShuffleBottom uses ShuffleRange to shuffle the bottom frac (between 0.0 and // 1.0) of the deck. See ShuffleRange and ShufflePart for information on // rounding and warnings. func (d *Deck[C]) ShuffleBottom(frac float64) error { return d.ShuffleRange(frac, 1.0) } + +// Strip removes all cards from the deck where shouldRemove returns true. +// shouldRemove is provided with each card in the deck and its index. +// It returns how many cards were stripped from the deck. +func (d *Deck[C]) Strip(shouldRemove func(idx int, c Card[C]) bool) int { + stripped := 0 + startStripRange := -1 + for i := 0; i < len(d.cards); i++ { + if shouldRemove(i, d.cards[i]) { + stripped++ + if startStripRange < 0 { + startStripRange = i + } + } else if startStripRange >= 0 { + d.cards = DeleteNFrom(d.cards, startStripRange, i-startStripRange) + i = startStripRange + startStripRange = -1 + } + } + if startStripRange >= 0 { + d.cards = d.cards[:startStripRange] + } + return stripped +}