#![allow(dead_code)]
use rand::thread_rng;
use rand::seq::SliceRandom;
use crate::cards::Card;
use crate::cards::Suit;
use crate::cards::Value;
#[derive(Clone)]
pub struct Hand {
pub vec: Vec<Card>
}
impl Hand {
pub fn from(vec: Vec<Card>) -> Hand {
Hand {
vec: vec
}
}
pub fn full_deck() -> Hand {
let mut h = vec![];
for suit_index in 0..4 {
for value_index in 0..13 {
h.push(Card::new(
Value::item_from_index(value_index),
Suit::item_from_index(suit_index)
))
}
}
Hand::from(h)
}
pub fn shuffle(&self) -> Hand {
let mut rng = thread_rng();
let mut clone = self.vec.clone();
clone.shuffle(&mut rng);
Hand::from(
clone
)
}
pub fn reverse(&self) -> Hand {
let mut clone = self.vec.clone();
clone.reverse();
Hand::from(
clone
)
}
pub fn pop_top(&mut self) -> Card {
self.vec.reverse();
let first_card = self.vec.pop().unwrap();
self.vec.reverse();
first_card
}
pub fn pop_bottom(&mut self) -> Card {
self.vec.pop().unwrap()
}
pub fn push_top(&self, card: Card) -> Hand {
self.reverse().push_bottom(card).reverse()
}
pub fn push_bottom(&self, card: Card) -> Hand {
let mut clone = self.vec.clone();
clone.push(card);
Hand::from(
clone
)
}
pub fn insert(&self, index: usize, card: Card) -> Hand {
let mut clone = self.vec.clone();
clone.insert(index, card);
Hand::from(
clone
)
}
pub fn stack_top(&self, hand: Hand) -> Hand {
let mut copy = self.clone();
for card in hand.reverse().vec {
copy = copy.push_top(card);
}
copy
}
pub fn stack_bottom(&self, hand: Hand) -> Hand {
let mut copy = self.clone();
for card in hand.vec {
copy = copy.push_bottom(card);
}
copy
}
}