use super::graph::Graph;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Edge<T> {
pub left: usize,
pub right: usize,
pub weight: T,
}
#[derive(Debug)]
pub struct EdgeList<T> {
edges: Vec<Edge<T>>,
}
impl<T> EdgeList<T> {
pub fn new() -> Self {
EdgeList { edges: vec![] }
}
pub fn len(&self) -> usize {
self.edges.len()
}
}
impl<T> Graph for EdgeList<T> {
type Vertex = usize;
type VertexValue = usize;
type Edge = Edge<T>;
type EdgeNodes = (Self::Vertex, Self::Vertex);
fn add_vertex(&mut self, _vertex: Self::VertexValue) {
unimplemented!();
}
fn remove_vertex(&mut self, vertex_id: usize) {
let result = self.edges.iter()
.enumerate()
.filter(|&(_, edge)| edge.left == vertex_id || edge.right == vertex_id)
.map(|(index, _)| index)
.collect::<Vec<usize>>();
for index in 0..result.len() {
self.edges.swap_remove(result.len() - index);
}
}
fn add_edge(&mut self, edge: Self::Edge) {
self.edges.push(edge);
}
fn remove_edge(&mut self, target: Self::EdgeNodes) -> Option<Self::Edge> {
let result = self.edges.iter()
.enumerate()
.find(|&(_, edge)| edge.left == target.0 && edge.right == target.1);
match result {
Some((index, _)) => {
let edge = self.edges.swap_remove(index);
return Some(edge)
},
None => return None,
}
}
fn neighbors(&self, vertex_id: usize) -> Vec<&Self::Vertex> {
self.edges.iter()
.filter(|&edge| edge.left == vertex_id || edge.right == vertex_id)
.map(|edge| if edge.left == vertex_id { &edge.right } else { &edge.left })
.collect::<Vec<&Self::Vertex>>()
}
fn find_vertex(&self, vertex_id: Self::VertexValue) -> Option<&Self::Vertex> {
let edge = self.edges.iter()
.find(|&edge| edge.left == vertex_id || edge.right == vertex_id);
match edge {
Some(edge) => {
if edge.left == vertex_id {
return Some(&edge.left)
} else {
return Some(&edge.right)
}
},
None => return None,
}
}
}