use crate::common::Deck;
use crate::Rng;
pub struct IntDeck<R: Rng> {
n: usize,
h: Vec<usize>,
r: R,
}
impl<R: Rng> IntDeck<R> {
pub fn new(n: usize, r: R) -> Self {
IntDeck{ n, r, h: Vec::new() }
}
pub fn remove(&mut self, cards: &[usize]) {
self.h.extend_from_slice(cards);
self.h.sort();
self.h.dedup();
}
}
impl<R: Rng> Deck for IntDeck<R> {
type Card = usize;
fn left(&self) -> usize { self.n - self.h.len() }
fn draw(&mut self) -> usize {
let mut x: usize = self.r.next_u64() as usize % self.left();
for y in self.h.iter() {
if x >= *y { x += 1; }
}
self.h.push(x);
self.h.sort();
return x;
}
fn refill(&mut self) {
self.h.clear();
}
}