use crate::types::{Key, Value, Vertex};
use crate::Edge;
pub trait AnyGraph<K, V>: Sized + Clone + PartialEq
where
K: Key,
V: Value,
{
fn vertices(&self) -> Vec<Vertex<K, V>>;
fn edges(&self) -> Vec<Edge<K>>;
fn add_vertex(&self, vertex: Vertex<K, V>) -> Option<Self>;
fn remove_vertex(&self, vertex: &Vertex<K, V>) -> Option<(Self, Vertex<K, V>, Vec<Edge<K>>)>;
fn remove_all_vertices(&self) -> Option<(Self, Vec<Vertex<K, V>>, Vec<Edge<K>>)>;
fn remove_vertex_where_key(&self, key: K) -> Option<(Self, Vertex<K, V>, Vec<Edge<K>>)>;
fn add_edge(&self, edge: Edge<K>) -> Option<Self>;
fn add_edge_between_keys(&self, key_from: K, key_to: K) -> Option<Self>;
fn remove_edge(&self, edge: &Edge<K>) -> Option<(Self, Edge<K>)>;
fn remove_edge_where_keys(&self, key_from: K, key_to: K) -> Option<(Self, Edge<K>)>;
fn remove_all_edges(&self) -> Option<(Self, Vec<Edge<K>>)>;
fn remove_all_edges_where_vertex(&self, vertex: &Vertex<K, V>) -> Option<(Self, Vec<Edge<K>>)>;
fn remove_all_edges_where_key(&self, key_from: K) -> Option<(Self, Vec<Edge<K>>)>;
fn remove_all_edges_from_vertex(&self, vertex: &Vertex<K, V>) -> Option<(Self, Vec<Edge<K>>)>;
fn remove_all_edges_from_key(&self, key_from: K) -> Option<(Self, Vec<Edge<K>>)>;
}