1use ae_direction::{Cardinal, Direction, Ordinal};
2
3#[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}