use crate::{Categories, Dice, Game, Scorecard, State};
#[derive(Debug, Clone, Copy)]
pub struct View<'a> {
game: &'a Game,
}
impl<'a> View<'a> {
pub(crate) const fn new(game: &'a Game) -> Self {
Self { game }
}
#[must_use]
pub fn dice(&self) -> Dice {
self.game.dice().expect("dice are showing")
}
#[must_use]
pub const fn rolls_left(&self) -> u8 {
self.game.rolls_left()
}
#[must_use]
pub const fn seat(&self) -> usize {
self.game.seat()
}
#[must_use]
pub const fn round(&self) -> u8 {
self.game.round()
}
#[must_use]
pub fn scorecard(&self) -> &'a Scorecard {
self.game.scorecard(self.seat())
}
#[must_use]
pub fn state(&self) -> State {
self.scorecard().state()
}
#[must_use]
pub fn legal_categories(&self) -> Categories {
self.state().legal_categories(self.dice())
}
pub fn opponents(&self) -> impl Iterator<Item = &'a Scorecard> {
let seat = self.seat();
let cards = self.game.scorecards();
cards[seat + 1..].iter().chain(&cards[..seat])
}
}