use super::board::Pos;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Dir {
H, V, DP, DN, }
impl Dir {
pub const ALL: [Dir; 4] = [Dir::H, Dir::V, Dir::DP, Dir::DN];
pub fn delta(self) -> (i16, i16) {
match self {
Dir::H => (1, 0),
Dir::V => (0, 1),
Dir::DP => (1, -1),
Dir::DN => (1, 1),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Line {
pub origin: Pos,
pub dir: Dir,
}
impl Line {
pub fn new(origin: Pos, dir: Dir) -> Self {
Self { origin, dir }
}
pub fn from_point(pos: Pos, dir: Dir, offset: u8, _line_len: u8) -> Self {
let (dx, dy) = dir.delta();
let origin = (pos.0 - offset as i16 * dx, pos.1 - offset as i16 * dy);
Self { origin, dir }
}
pub fn positions(self, line_len: u8) -> impl Iterator<Item = Pos> {
let (dx, dy) = self.dir.delta();
let (ox, oy) = self.origin;
(0..line_len as i16).map(move |i| (ox + i * dx, oy + i * dy))
}
}