use rustc_hash::FxHashMap;
use crate::{
card::Card,
error::EvalResult,
evaluate::{
eval::Eval,
evaluation::{self, Evaluation},
five_card::lookup_table::LookupTable as FiveCardTable,
poker_type::{FiveCard, ThreeCard},
three_card::lookup_table::LookupTable as ThreeCardTable,
},
};
#[derive(Debug, PartialEq, Eq, Default)]
pub struct Evaluator {
three_card_table: ThreeCardTable,
five_card_table: FiveCardTable,
}
impl Evaluator {
pub fn new() -> Self {
Self {
three_card_table: ThreeCardTable::new(),
five_card_table: FiveCardTable::new(),
}
}
pub fn evaluate_five(&self, cards: impl AsRef<[Card]>) -> EvalResult<FiveCard> {
evaluation::evaluate_five(self, cards.as_ref())
}
pub fn evaluate_three(&self, cards: impl AsRef<[Card]>) -> EvalResult<ThreeCard> {
evaluation::evaluate_three(self, cards.as_ref())
}
}
impl Evaluation for Evaluator {
type LookupFive = FxHashMap<i32, Eval<FiveCard>>;
type LookupThree = FxHashMap<i32, Eval<ThreeCard>>;
fn flush_lookup_five(&self) -> &Self::LookupFive { &self.five_card_table.flush_lookup }
fn unsuited_lookup_five(&self) -> &Self::LookupFive { &self.five_card_table.unsuited_lookup }
fn flush_lookup_three(&self) -> &Self::LookupThree { &self.three_card_table.flush_lookup }
fn unsuited_lookup_three(&self) -> &Self::LookupThree { &self.three_card_table.unsuited_lookup }
}