use crate::pen::Pen;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Cell(char, Occupancy, Pen);
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub(crate) enum Occupancy {
Single,
WideHead,
WideTail,
}
impl Occupancy {
pub(crate) fn width(&self) -> u8 {
match self {
Occupancy::Single => 1,
Occupancy::WideHead => 2,
Occupancy::WideTail => 0,
}
}
}
impl Cell {
pub(crate) fn new(ch: char, occupancy: Occupancy, pen: Pen) -> Self {
Cell(ch, occupancy, pen)
}
pub(crate) fn blank(pen: Pen) -> Self {
Cell(' ', Occupancy::Single, pen)
}
pub fn is_default(&self) -> bool {
self.0 == ' ' && self.1 == Occupancy::Single && self.2.is_default()
}
pub fn char(&self) -> char {
self.0
}
pub(crate) fn occupancy(&self) -> Occupancy {
self.1
}
pub fn width(&self) -> u8 {
self.1.width()
}
pub fn pen(&self) -> &Pen {
&self.2
}
pub(crate) fn set(&mut self, ch: char, occupancy: Occupancy, pen: Pen) {
self.0 = ch;
self.1 = occupancy;
self.2 = pen;
}
}
impl Default for Cell {
fn default() -> Self {
Self::blank(Pen::default())
}
}