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 +}