pub type DefaultVertexSet<G> = <G as WithVertexSet>::VertexSet;
pub type DefaultEdgeSet<G> = <G as WithEdgeSet>::EdgeSet;
pub trait Set<Item> {
fn insert(&mut self, item: Item) -> bool;
fn remove(&mut self, item: Item) -> bool;
fn contains(&self, item: Item) -> bool;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
}
pub trait VertexSet<G: WithVertex>: Set<Vertex<G>> {
fn new_vertex_set(g: &G) -> Self;
}
pub trait WithVertexSet: WithVertex {
type VertexSet: VertexSet<Self>;
fn vertex_set<S>(&self) -> S
where S: VertexSet<Self>
{
S::new_vertex_set(self)
}
fn default_vertex_set(&self) -> DefaultVertexSet<Self> {
self.vertex_set()
}
}
pub trait EdgeSet<G: WithEdge>: Set<Edge<G>> {
fn new_edge_set(g: &G) -> Self;
}
pub trait WithEdgeSet: WithEdge {
type EdgeSet: EdgeSet<Self>;
fn edge_set<S>(&self) -> S
where S: EdgeSet<Self>
{
S::new_edge_set(self)
}
fn default_edge_set(&self) -> DefaultEdgeSet<Self> {
self.edge_set()
}
}