use geo_types::Coord;
pub trait Vertex: Copy + PartialEq {
#[must_use]
fn position(&self) -> Coord<i32>;
#[must_use]
fn with_position(self, position: Coord<i32>) -> Self;
}
impl Vertex for Coord<i32> {
fn position(&self) -> Coord<i32> {
*self
}
fn with_position(self, position: Coord<i32>) -> Self {
position
}
}
#[derive(Debug, Clone, Copy, PartialEq, Hash)]
pub struct Measured<M: Copy + PartialEq> {
pub position: Coord<i32>,
pub m: M,
}
impl<M: Copy + PartialEq> Measured<M> {
#[must_use]
pub fn new(x: i32, y: i32, m: M) -> Self {
Self {
position: Coord { x, y },
m,
}
}
}
impl<M: Copy + PartialEq> Vertex for Measured<M> {
fn position(&self) -> Coord<i32> {
self.position
}
fn with_position(self, position: Coord<i32>) -> Self {
Self { position, ..self }
}
}
pub trait PolyVertex: Vertex {
#[must_use]
fn synthetic_at(position: Coord<i32>) -> Self;
}
impl PolyVertex for Coord<i32> {
fn synthetic_at(position: Coord<i32>) -> Self {
position
}
}
impl<M: Copy + PartialEq + Default> PolyVertex for Measured<M> {
fn synthetic_at(position: Coord<i32>) -> Self {
Self {
position,
m: M::default(),
}
}
}