1use std::cmp::PartialEq;
2use std::collections::HashSet;
3use std::fmt;
4use std::hash::Hash;
5
6#[derive(Clone, Debug)]
12pub struct Node<I>
13where
14 I: Clone + fmt::Debug + Eq + Hash + PartialEq + Send + Sync,
15{
16 id: I,
17 deps: HashSet<I>,
18}
19
20impl<I> Node<I>
21where
22 I: Clone + fmt::Debug + Eq + Hash + PartialEq + Send + Sync,
23{
24 pub fn new(id: I) -> Node<I> {
25 Node {
26 id,
27 deps: HashSet::default(),
28 }
29 }
30
31 pub fn id(&self) -> &I {
32 &self.id
33 }
34 pub fn deps(&self) -> &HashSet<I> {
35 &self.deps
36 }
37 pub fn add_dep(&mut self, dep: I) {
38 self.deps.insert(dep);
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn empty_node() {
48 let node = Node::new("node");
49
50 assert_eq!(*node.id(), "node");
51 assert_eq!(node.deps().len(), 0);
52 }
53
54 #[test]
55 fn empty_usize_node() {
56 let node: Node<usize> = Node::new(42);
57
58 assert_eq!(*node.id(), 42);
59 assert_eq!(node.deps.len(), 0);
60 }
61
62 #[test]
63 fn one_dep() {
64 let mut root = Node::new("root");
65 let dep1 = Node::new("dep1");
66
67 root.add_dep(dep1.id());
68
69 assert_eq!(root.deps().len(), 1);
70 }
71
72 #[test]
73 fn two_deps() {
74 let mut root = Node::new("root");
75 let dep1 = Node::new("dep1");
76 let dep2 = Node::new("dep2");
77
78 root.add_dep(dep1.id());
79 root.add_dep(dep2.id());
80
81 assert_eq!(root.deps().len(), 2);
82 assert_eq!(dep1.deps().len(), 0);
83 assert_eq!(dep2.deps().len(), 0);
84 }
85
86 #[test]
87 fn diamonds() {
88 let mut root = Node::new("root");
89 let mut dep1 = Node::new("dep1");
90 let mut dep2 = Node::new("dep2");
91 let leaf = Node::new("leaf");
92
93 root.add_dep(dep1.id());
94 root.add_dep(dep2.id());
95 dep1.add_dep(leaf.id());
96 dep2.add_dep(leaf.id());
97
98 assert_eq!(root.deps().len(), 2);
99 assert_eq!(dep1.deps().len(), 1);
100 assert_eq!(dep2.deps().len(), 1);
101 assert_eq!(leaf.deps().len(), 0);
102 }
103}