use crate::{
objects::{Cycle, HalfEdge},
storage::Handle,
};
pub trait UpdateCycle {
#[must_use]
fn add_half_edges(
&self,
edges: impl IntoIterator<Item = Handle<HalfEdge>>,
) -> Self;
#[must_use]
fn update_half_edge(
&self,
handle: &Handle<HalfEdge>,
update: impl FnOnce(&Handle<HalfEdge>) -> Handle<HalfEdge>,
) -> Self;
#[must_use]
fn replace_half_edge<const N: usize>(
&self,
handle: &Handle<HalfEdge>,
replace: impl FnOnce(&Handle<HalfEdge>) -> [Handle<HalfEdge>; N],
) -> Self;
}
impl UpdateCycle for Cycle {
fn add_half_edges(
&self,
edges: impl IntoIterator<Item = Handle<HalfEdge>>,
) -> Self {
let edges = self.half_edges().iter().cloned().chain(edges);
Cycle::new(edges)
}
fn update_half_edge(
&self,
handle: &Handle<HalfEdge>,
update: impl FnOnce(&Handle<HalfEdge>) -> Handle<HalfEdge>,
) -> Self {
let edges = self
.half_edges()
.replace(handle, [update(handle)])
.expect("Half-edge not found");
Cycle::new(edges)
}
fn replace_half_edge<const N: usize>(
&self,
handle: &Handle<HalfEdge>,
replace: impl FnOnce(&Handle<HalfEdge>) -> [Handle<HalfEdge>; N],
) -> Self {
let edges = self
.half_edges()
.replace(handle, replace(handle))
.expect("Half-edge not found");
Cycle::new(edges)
}
}