use crate::{EdgeAx, Hex, HexAx, Node, NodeAx};
pub trait Nodes<TNode>
where
TNode: Node,
{
fn nodes(&self) -> impl Iterator<Item = TNode>;
}
impl Nodes<NodeAx> for HexAx {
fn nodes(&self) -> impl Iterator<Item = NodeAx> {
[
self.n_south_west().into(),
self.n_south_east().into(),
self.n_east().into(),
self.n_north_east().into(),
self.n_north_west().into(),
self.n_west().into(),
]
.into_iter()
}
}
impl Nodes<NodeAx> for EdgeAx {
fn nodes(&self) -> impl Iterator<Item = NodeAx> {
if self.q % 2 == 0 {
[
NodeAx::new(
self.q * 3 / 2 + 1,
((self.r * 3) as f32 / 2.).floor() as isize,
),
NodeAx::new(
self.q * 3 / 2 - 1,
((self.r * 3) as f32 / 2.).ceil() as isize,
),
]
} else {
if self.r % 2 == 0 {
[
NodeAx::new(
((self.q * 3) as f32 / 2.).floor() as isize,
self.r * 3 / 2 + 1,
),
NodeAx::new(
((self.q * 3) as f32 / 2.).ceil() as isize,
self.r * 3 / 2 - 1,
),
]
} else {
[
NodeAx::new(
((self.q * 3) as f32 / 2.).floor() as isize,
((self.r * 3) as f32 / 2.).floor() as isize,
),
NodeAx::new(
((self.q * 3) as f32 / 2.).ceil() as isize,
((self.r * 3) as f32 / 2.).ceil() as isize,
),
]
}
}
.into_iter()
}
}
#[cfg(test)]
mod test {
#[test]
fn test_nodes_for_edges() {}
}