Skip to main content

weavatrix_graph/topology/
view.rs

1use super::NodeIndex;
2use core::hash::Hash;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct EdgeEndpoints<Node = NodeIndex> {
7    source: Node,
8    target: Node,
9}
10
11impl<Node: Copy> EdgeEndpoints<Node> {
12    #[must_use]
13    pub const fn new(source: Node, target: Node) -> Self {
14        Self { source, target }
15    }
16
17    #[must_use]
18    pub const fn source(self) -> Node {
19        self.source
20    }
21
22    #[must_use]
23    pub const fn target(self) -> Node {
24        self.target
25    }
26}
27
28pub trait GraphView {
29    type Node: Copy + Eq + Hash;
30    type Edge: Copy + Eq + Hash;
31
32    fn node_count(&self) -> usize;
33
34    fn edge_count(&self) -> usize;
35
36    fn contains_node(&self, node: Self::Node) -> bool {
37        self.node_indices().any(|candidate| candidate == node)
38    }
39
40    fn contains_edge(&self, edge: Self::Edge) -> bool {
41        self.edge_indices().any(|candidate| candidate == edge)
42    }
43
44    fn node_indices(&self) -> impl Iterator<Item = Self::Node> + '_;
45
46    fn edge_indices(&self) -> impl Iterator<Item = Self::Edge> + '_;
47
48    fn edge_endpoints(&self, edge: Self::Edge) -> Option<EdgeEndpoints<Self::Node>>;
49
50    fn edge_references(
51        &self,
52    ) -> impl Iterator<Item = (Self::Edge, EdgeEndpoints<Self::Node>)> + '_ {
53        self.edge_indices()
54            .filter_map(|edge| self.edge_endpoints(edge).map(|endpoints| (edge, endpoints)))
55    }
56
57    fn outgoing_edges(&self, node: Self::Node) -> impl Iterator<Item = Self::Edge> + '_;
58
59    fn incoming_edges(&self, node: Self::Node) -> impl Iterator<Item = Self::Edge> + '_;
60}
61
62pub trait IndexGraphView: GraphView {
63    fn node_bound(&self) -> usize;
64
65    fn edge_bound(&self) -> usize;
66
67    fn node_slot(node: Self::Node) -> usize;
68
69    fn edge_slot(edge: Self::Edge) -> usize;
70}