ae_position/
delta.rs

1use ae_direction::{Cardinal, Direction, Ordinal};
2
3/// A single unit change in relative position meant to be added to a `Position`
4/// values intended to be either 1, 0 or -1 and transformed from a `Direction`
5#[derive(PartialEq, Clone, Debug)]
6pub struct Delta {
7    pub x: i8,
8    pub y: i8,
9}
10
11pub const CARDINAL_DELTAS: [Delta; 4] = [
12    Delta { x: 0, y: 1 },
13    Delta { x: 1, y: 0 },
14    Delta { x: 0, y: -1 },
15    Delta { x: -1, y: 0 },
16];
17
18pub const ORDINAL_DELTAS: [Delta; 4] = [
19    Delta { x: 1, y: 1 },
20    Delta { x: 1, y: -1 },
21    Delta { x: -1, y: 1 },
22    Delta { x: -1, y: -1 },
23];
24
25impl From<Cardinal> for Delta {
26    fn from(dir: Cardinal) -> Self {
27        dir.into()
28    }
29}
30
31impl From<Ordinal> for Delta {
32    fn from(dir: Ordinal) -> Self {
33        dir.into()
34    }
35}
36
37impl From<Cardinal> for &Delta {
38    fn from(dir: Cardinal) -> Self {
39        match dir {
40            Cardinal::North => &Delta { x: 0, y: -1 },
41            Cardinal::East => &Delta { x: 1, y: 0 },
42            Cardinal::South => &Delta { x: 0, y: 1 },
43            Cardinal::West => &Delta { x: -1, y: 0 },
44        }
45    }
46}
47
48impl From<Ordinal> for &Delta {
49    fn from(dir: Ordinal) -> Self {
50        match dir {
51            Ordinal::Northeast => &Delta { x: 1, y: -1 },
52            Ordinal::Southeast => &Delta { x: 1, y: 1 },
53            Ordinal::Southwest => &Delta { x: -1, y: 1 },
54            Ordinal::Northwest => &Delta { x: -1, y: -1 },
55        }
56    }
57}
58
59impl From<Direction> for Delta {
60    fn from(dir: Direction) -> Self {
61        match dir {
62            Direction::Cardinal(dir) => match dir {
63                Cardinal::North => Delta { x: 0, y: -1 },
64                Cardinal::East => Delta { x: 1, y: 0 },
65                Cardinal::South => Delta { x: 0, y: 1 },
66                Cardinal::West => Delta { x: -1, y: 0 },
67            },
68            Direction::Ordinal(dir) => match dir {
69                Ordinal::Northeast => Delta { x: 1, y: -1 },
70                Ordinal::Southeast => Delta { x: 1, y: 1 },
71                Ordinal::Southwest => Delta { x: -1, y: 1 },
72                Ordinal::Northwest => Delta { x: -1, y: -1 },
73            },
74        }
75    }
76}