use awint::awint_dag::triple_arena::Ptr;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum EdgeKind<QCEdge: Ptr> {
Transverse(QCEdge, usize),
Concentrate,
Dilute,
}
#[derive(Debug, Clone, Copy)]
pub struct Edge<QCNode: Ptr, QCEdge: Ptr> {
pub kind: EdgeKind<QCEdge>,
pub to: QCNode,
}
impl<QCNode: Ptr, QCEdge: Ptr> Edge<QCNode, QCEdge> {
pub fn new(kind: EdgeKind<QCEdge>, to: QCNode) -> Self {
Self { kind, to }
}
}
#[derive(Debug, Clone)]
pub struct Path<QCNode: Ptr, QCEdge: Ptr> {
pub sink: QCNode,
pub edges: Vec<Edge<QCNode, QCEdge>>,
}
impl<QCNode: Ptr, QCEdge: Ptr> Path<QCNode, QCEdge> {
pub fn new(sink: QCNode) -> Self {
Self {
sink,
edges: vec![],
}
}
pub fn sink(&self) -> QCNode {
self.sink
}
pub fn edges(&self) -> &[Edge<QCNode, QCEdge>] {
&self.edges
}
pub fn push(&mut self, edge: Edge<QCNode, QCEdge>) {
self.edges.push(edge)
}
pub fn extend<I: IntoIterator<Item = Edge<QCNode, QCEdge>>>(&mut self, edges: I) {
self.edges.extend(edges)
}
}
#[derive(Debug, Clone)]
pub struct HyperPath<QCNode: Ptr, QCEdge: Ptr> {
source: QCNode,
paths: Vec<Path<QCNode, QCEdge>>,
}
impl<QCNode: Ptr, QCEdge: Ptr> HyperPath<QCNode, QCEdge> {
pub fn new(source: QCNode) -> Self {
Self {
source,
paths: vec![],
}
}
pub fn source(&self) -> QCNode {
self.source
}
pub fn push(&mut self, path: Path<QCNode, QCEdge>) {
self.paths.push(path)
}
pub fn paths(&self) -> &[Path<QCNode, QCEdge>] {
&self.paths
}
pub fn paths_mut(&mut self) -> &mut [Path<QCNode, QCEdge>] {
&mut self.paths
}
}