grapl_graph_descriptions/
graph.rs

1use std::collections::HashMap;
2
3use crate::graph_description::{Edge, EdgeList, GeneratedSubgraphs, Graph, Node};
4use crate::node::NodeT;
5
6impl Graph {
7    pub fn new(timestamp: u64) -> Self {
8        Graph {
9            nodes: HashMap::new(),
10            edges: HashMap::new(),
11            timestamp,
12        }
13    }
14
15    pub fn is_empty(&self) -> bool {
16        self.nodes.is_empty() && self.edges.is_empty()
17    }
18
19    pub fn merge(&mut self, other: &Graph) {
20        self.edges.extend(other.edges.clone());
21
22        for (node_key, other_node) in other.nodes.iter() {
23            self.nodes
24                .entry(node_key.clone())
25                .and_modify(|node| {
26                    node.merge(other_node);
27                })
28                .or_insert_with(|| other_node.clone());
29        }
30    }
31
32    pub fn add_node<N>(&mut self, node: N)
33    where
34        N: Into<Node>,
35    {
36        let node = node.into();
37        let key = node.clone_node_key();
38
39        self.nodes.insert(key.to_string(), node);
40        self.edges
41            .entry(key)
42            .or_insert_with(|| EdgeList { edges: vec![] });
43    }
44
45    pub fn with_node<N>(mut self, node: N) -> Graph
46    where
47        N: Into<Node>,
48    {
49        self.add_node(node);
50        self
51    }
52
53    pub fn add_edge(
54        &mut self,
55        edge_name: impl Into<String>,
56        from: impl Into<String>,
57        to: impl Into<String>,
58    ) {
59        let from = from.into();
60        let to = to.into();
61        let edge_name = edge_name.into();
62        let edge = Edge {
63            from: from.clone(),
64            to,
65            edge_name,
66        };
67
68        self.edges
69            .entry(from)
70            .or_insert_with(|| EdgeList {
71                edges: Vec::with_capacity(1),
72            })
73            .edges
74            .push(edge);
75    }
76}
77
78impl GeneratedSubgraphs {
79    pub fn new(subgraphs: Vec<Graph>) -> GeneratedSubgraphs {
80        GeneratedSubgraphs { subgraphs }
81    }
82}