grapl_graph_descriptions/
graph.rs1use 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}