use crate::{ grid::config::{Entity, Position}, settings::object::Object, }; /// Cell denotes a particular cell on a [`Table`]. /// /// For example such table has 4 cells. /// Which indexes are (0, 0), (0, 1), (1, 0), (1, 1). /// /// ```text /// ┌───┬───┐ /// │ 0 │ 1 │ /// ├───┼───┤ /// │ 1 │ 2 │ /// └───┴───┘ /// ``` /// /// [`Table`]: crate::Table #[derive(Debug, Default, PartialEq, Eq, PartialOrd, Ord)] pub struct Cell(usize, usize); impl Cell { /// Create new cell structure. pub fn new(row: usize, col: usize) -> Self { Self(row, col) } } impl From for Cell { fn from((row, col): Position) -> Self { Self(row, col) } } impl Object for Cell { type Iter = EntityOnce; fn cells(&self, _: &I) -> Self::Iter { EntityOnce::new(Some(Entity::Cell(self.0, self.1))) } } impl Object for Position { type Iter = EntityOnce; fn cells(&self, _: &I) -> Self::Iter { EntityOnce::new(Some(Entity::Cell(self.0, self.1))) } } /// An [`Iterator`] which returns an entity once. #[derive(Debug)] pub struct EntityOnce { entity: Option, } impl EntityOnce { pub(crate) const fn new(entity: Option) -> Self { Self { entity } } } impl Iterator for EntityOnce { type Item = Entity; fn next(&mut self) -> Option { self.entity.take() } }