gridit 0.1.0

2D grid library utilizing the fun of iterators
Documentation
use crate::grid::Position;

pub struct PositionsIter {
    pub(crate) len: usize,
    pub(crate) width: usize,
    pub(crate) idx: usize,
}

impl Iterator for PositionsIter {
    type Item = Position;
    fn next(&mut self) -> Option<Self::Item> {
        if self.idx >= self.len {
            return None;
        }
        let x = self.idx % self.width;
        let y = self.idx / self.width;
        self.idx += 1;
        Some((x, y).into())
    }
}

#[cfg(test)]
mod tests {
    use crate::Grid;

    #[test]
    fn grid_positions_iter() {
        let grid = Grid {
            width: 3,
            height: 2,
            items: vec![0; 3 * 2],
        };

        let mut positions = grid.positions();
        assert_eq!(positions.next(), Some((0, 0).into()));
        assert_eq!(positions.next(), Some((1, 0).into()));
        assert_eq!(positions.next(), Some((2, 0).into()));
        assert_eq!(positions.next(), Some((0, 1).into()));
        assert_eq!(positions.next(), Some((1, 1).into()));
        assert_eq!(positions.next(), Some((2, 1).into()));
        assert_eq!(positions.next(), None);
    }
}