use crate::{Edge, EdgeAx, HexAx, NodeAx};
pub trait Edges<TEdge>
where
TEdge: Edge,
{
fn edges(&self) -> impl Iterator<Item = TEdge>;
}
impl Edges<EdgeAx> for HexAx {
fn edges(&self) -> impl Iterator<Item = EdgeAx> {
[
EdgeAx::new(self.q * 2, self.r * 2 - 1),
EdgeAx::new(self.q * 2 + 1, self.r * 2 - 1),
EdgeAx::new(self.q * 2 + 1, self.r * 2),
EdgeAx::new(self.q * 2, self.r * 2 + 1),
EdgeAx::new(self.q * 2 - 1, self.r * 2 + 1),
EdgeAx::new(self.q * 2 - 1, self.r * 2),
]
.into_iter()
}
}
impl Edges<EdgeAx> for EdgeAx {
fn edges(&self) -> impl Iterator<Item = EdgeAx> {
if self.q % 2 == 0 {
[
EdgeAx::new(self.q - 1, self.r),
EdgeAx::new(self.q - 1, self.r + 1),
EdgeAx::new(self.q + 1, self.r - 1),
EdgeAx::new(self.q + 1, self.r),
]
} else {
if self.r % 2 == 0 {
[
EdgeAx::new(self.q - 1, self.r + 1),
EdgeAx::new(self.q, self.r + 1),
EdgeAx::new(self.q, self.r - 1),
EdgeAx::new(self.q + 1, self.r - 1),
]
} else {
[
EdgeAx::new(self.q - 1, self.r),
EdgeAx::new(self.q, self.r - 1),
EdgeAx::new(self.q, self.r + 1),
EdgeAx::new(self.q + 1, self.r),
]
}
}
.into_iter()
}
}
impl Edges<EdgeAx> for NodeAx {
fn edges(&self) -> impl Iterator<Item = EdgeAx> {
match self.q.rem_euclid(3) {
1 => {
assert_eq!(self.r.rem_euclid(3), 1);
[
EdgeAx::new((self.q * 2 - 2) / 3, (self.r * 2 + 1) / 3),
EdgeAx::new((self.q * 2 + 1) / 3, (self.r * 2 + 1) / 3),
EdgeAx::new((self.q * 2 + 1) / 3, (self.r * 2 - 2) / 3),
]
}
2 => {
assert_eq!(self.r.rem_euclid(3), 2);
[
EdgeAx::new((self.q * 2 - 1) / 3, (self.r * 2 + 2) / 3),
EdgeAx::new((self.q * 2 - 1) / 3, (self.r * 2 - 1) / 3),
EdgeAx::new((self.q * 2 + 2) / 3, (self.r * 2 - 1) / 3),
]
}
_ => panic!(
"Tried to evaluate hexes of an invalid node coordinate: {:?}",
self
),
}
.into_iter()
}
}