Refactor Strip (already).
Stripping cards from the Hand will also be useful, so I pulled the logic of Strip out into arrayutil (more efficiently, too) and rewrote deck.Strip to use it.
This commit is contained in:
parent
222d4375ee
commit
75de281cee
@ -275,22 +275,7 @@ func (d *Deck[C]) ShuffleBottom(frac float64) error {
|
|||||||
// shouldRemove is provided with each card in the deck and its index.
|
// shouldRemove is provided with each card in the deck and its index.
|
||||||
// It returns how many cards were stripped from the deck.
|
// It returns how many cards were stripped from the deck.
|
||||||
func (d *Deck[C]) Strip(shouldRemove func(idx int, c Card[C]) bool) int {
|
func (d *Deck[C]) Strip(shouldRemove func(idx int, c Card[C]) bool) int {
|
||||||
stripped := 0
|
origLen := d.Len()
|
||||||
startStripRange := -1
|
d.cards = Strip(d.cards, shouldRemove)
|
||||||
for i := 0; i < len(d.cards); i++ {
|
return origLen - d.Len()
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
@ -126,3 +126,22 @@ func ShufflePart[T any](slice []T, r *rand.Rand, loc, n int) {
|
|||||||
}
|
}
|
||||||
ShuffleAll(slice[loc:loc+n], r)
|
ShuffleAll(slice[loc:loc+n], r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Strip iterates T, removing any element for which removeWhen returns true
|
||||||
|
// (when provided the index of the element and the element itself as arguments).
|
||||||
|
// It returns the stripped slice.
|
||||||
|
func Strip[T any](slice []T, removeWhen func(idx int, t T) bool) []T {
|
||||||
|
if len(slice) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
to := 0
|
||||||
|
for from, e := range slice {
|
||||||
|
if !removeWhen(from, e) {
|
||||||
|
if to != from {
|
||||||
|
slice[to] = slice[from]
|
||||||
|
}
|
||||||
|
to++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return slice[:to]
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user