use std::collections::{BTreeMap, BTreeSet};
use crate::{port::BoundPort, Site};
use super::port::EdgeEnd;
pub trait Graph: Default + Clone {
type Node: Ord + Copy;
type Edge: Ord + Copy;
type PortLabel: Ord + Clone;
fn nodes_iter(&self) -> impl Iterator<Item = Self::Node> + '_;
fn edges_iter(&self) -> impl Iterator<Item = Self::Edge> + '_;
fn get_port_site(&self, bound_port: BoundPort<Self::Edge>)
-> Site<Self::Node, Self::PortLabel>;
fn get_bound_ports(
&self,
site: Site<Self::Node, Self::PortLabel>,
) -> impl Iterator<Item = BoundPort<Self::Edge>> + '_;
fn get_sites(
&self,
node: Self::Node,
) -> impl Iterator<Item = Site<Self::Node, Self::PortLabel>> + '_;
fn incident_node(&self, edge: Self::Edge, end: EdgeEnd) -> Self::Node {
let bound_port = BoundPort { edge, end };
self.get_port_site(bound_port).node
}
fn link_sites(
&mut self,
left: Site<Self::Node, Self::PortLabel>,
right: Site<Self::Node, Self::PortLabel>,
);
fn add_subgraph(
&mut self,
graph: &Self,
nodes: &BTreeSet<Self::Node>,
) -> BTreeMap<Self::Node, Self::Node>;
}