gridit 0.1.0

2D grid library utilizing the fun of iterators
Documentation
use super::{BoardPiece, PColor, Piece};
use ggez::graphics;
use gridit::pattern::{DirectionPattern, Repeat};
use gridit::{Grid, Position, PositionsEnumerator};

pub struct Queen {
    img: graphics::Image,
    pcolor: PColor,
}

impl Queen {
    pub fn new(pcolor: PColor, img: graphics::Image) -> Self {
        Self { pcolor, img }
    }
}

impl Piece for Queen {
    fn image(&self) -> &graphics::Image {
        &self.img
    }

    fn possible_moves(&self, grid: &Grid<BoardPiece>, pos: Position) -> Vec<Position> {
        let patterns = [
            DirectionPattern::new((0, 1), Repeat::TillEnd),
            DirectionPattern::new((0, -1), Repeat::TillEnd),
            DirectionPattern::new((1, 0), Repeat::TillEnd),
            DirectionPattern::new((-1, 0), Repeat::TillEnd),
            DirectionPattern::new((1, 1), Repeat::TillEnd),
            DirectionPattern::new((-1, -1), Repeat::TillEnd),
            DirectionPattern::new((1, -1), Repeat::TillEnd),
            DirectionPattern::new((-1, 1), Repeat::TillEnd),
        ];

        patterns
            .iter()
            .map(|pattern| {
                let mut prev: &Option<Box<dyn Piece + 'static>> = &None;
                grid.pattern(pos, *pattern)
                    .grid_positions()
                    .take_while(|(_, o)| {
                        if matches!(prev, Some(p) if p.pcolor() != self.pcolor) {
                            return false;
                        }
                        if self.same_pcolor(o) {
                            return false;
                        }
                        prev = &o;
                        true
                    })
                    .map(|(p, _)| p)
                    .collect::<Vec<Position>>()
            })
            .flatten()
            .collect()
    }

    fn pcolor(&self) -> PColor {
        self.pcolor
    }
}