Compare commits

..

2 Commits

Author SHA1 Message Date
75de281cee
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.
2023-04-01 19:40:28 -07:00
222d4375ee
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).
2023-04-01 19:31:50 -07:00
2 changed files with 29 additions and 1 deletions

View File

@ -264,9 +264,18 @@ func (d *Deck[C]) ShuffleTop(frac float64) error {
return d.ShuffleRange(0.0, frac) 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 // 1.0) of the deck. See ShuffleRange and ShufflePart for information on
// rounding and warnings. // rounding and warnings.
func (d *Deck[C]) ShuffleBottom(frac float64) error { func (d *Deck[C]) ShuffleBottom(frac float64) error {
return d.ShuffleRange(frac, 1.0) 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 {
origLen := d.Len()
d.cards = Strip(d.cards, shouldRemove)
return origLen - d.Len()
}

View File

@ -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]
}