#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum Turn {
Terminal,
Chance,
Choice(usize),
}
impl Turn {
pub fn position(&self) -> usize {
match self {
Self::Choice(c) => *c,
_ => panic!("don't ask"),
}
}
pub fn is_choice(&self) -> bool {
matches!(self, Self::Choice(_))
}
pub fn is_chance(&self) -> bool {
matches!(self, Self::Chance)
}
pub fn is_terminal(&self) -> bool {
matches!(self, Self::Terminal)
}
pub fn display(&self) -> usize {
match self {
Self::Choice(c) => *c + 1,
_ => panic!("don't ask"),
}
}
pub fn label(&self) -> String {
format!("P{}", self.display())
}
}
impl rbp_core::Arbitrary for Turn {
fn random() -> Self {
Self::Choice(rand::random_range(0..rbp_core::N))
}
}
impl From<usize> for Turn {
fn from(player: usize) -> Self {
Self::Choice(player)
}
}
impl TryFrom<&str> for Turn {
type Error = anyhow::Error;
fn try_from(s: &str) -> Result<Self, Self::Error> {
match s {
"XX" => Ok(Self::Terminal),
"??" => Ok(Self::Chance),
turn => turn[1..]
.parse::<usize>()
.map(Self::Choice)
.map_err(|_| anyhow::anyhow!("invalid player turn")),
}
}
}
impl std::fmt::Display for Turn {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Choice(c) => write!(f, "P{}", c),
Self::Terminal => write!(f, "-"),
Self::Chance => write!(f, "?"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PositionName {
BTN,
SB,
BB,
UTG(usize),
MP(usize),
HJ,
CO,
}
impl PositionName {
pub fn from_seat(seat: usize, dealer: usize, table: usize) -> Self {
let offset = (seat + table - dealer) % table;
match table {
2 => match offset {
0 => Self::BTN,
_ => Self::BB,
},
6 => match offset {
0 => Self::BTN,
1 => Self::SB,
2 => Self::BB,
3 => Self::UTG(0),
4 => Self::HJ,
_ => Self::CO,
},
_ => match offset {
0 => Self::BTN,
1 => Self::SB,
2 => Self::BB,
3 => Self::UTG(0),
4 => Self::UTG(1),
5 => Self::MP(0),
6 => Self::MP(1),
7 => Self::HJ,
_ => Self::CO,
},
}
}
}
impl std::fmt::Display for PositionName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::BTN => write!(f, "BTN"),
Self::SB => write!(f, "SB"),
Self::BB => write!(f, "BB"),
Self::UTG(0) => write!(f, "UTG"),
Self::UTG(n) => write!(f, "UTG+{}", n),
Self::MP(0) => write!(f, "MP"),
Self::MP(n) => write!(f, "MP+{}", n),
Self::HJ => write!(f, "HJ"),
Self::CO => write!(f, "CO"),
}
}
}