1use anyhow::Result;
2
3use crate::{EdgeID, NodeID, Nodes, VisitableCompound};
4
5pub trait MutableCompound: VisitableCompound {
6 fn add_node_with_data(&mut self, node: impl AsRef<NodeID>, parent: Option<impl AsRef<NodeID>>, edge: impl AsRef<EdgeID>, node_data: Self::NData) -> Result<()>;
7 fn move_node(&mut self, id: impl AsRef<NodeID>, new_parent: Option<impl AsRef<NodeID>>) -> Result<()>;
8 fn remove_node_ungrouping(&mut self, id: impl AsRef<NodeID>) -> Result<()>;
9 fn remove_node_and_children(&mut self, id: impl AsRef<NodeID>) -> Result<Nodes>;
10 fn remove_children(&mut self, id: impl AsRef<NodeID>) -> Result<Nodes>;
11
12 fn add_edge_with_data(&mut self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>, edge_data: Self::EData) -> Result<()>;
13 fn remove_edge(&mut self, id: impl AsRef<EdgeID>) -> Result<()>;
14 fn clear_edges(&mut self, id: impl AsRef<NodeID>) -> Result<()>;
15 fn move_edge(&mut self, id: impl AsRef<EdgeID>, new_source: impl AsRef<NodeID>, new_target: impl AsRef<NodeID>) -> Result<()>;
16
17 fn set_data(&mut self, data: Self::GData);
18 fn set_node_data(&mut self, id: impl AsRef<NodeID>, data: Self::NData) -> Result<()>;
19 fn set_edge_data(&mut self, id: impl AsRef<EdgeID>, data: Self::EData) -> Result<()>;
20
21 fn with_data(&mut self, transform: &dyn Fn(&mut Self::GData));
22 fn with_node_data(&mut self, id: impl AsRef<NodeID>, transform: &dyn Fn(&mut Self::NData)) -> Result<()>;
23 fn with_edge_data(&mut self, id: impl AsRef<EdgeID>, transform: &dyn Fn(&mut Self::EData)) -> Result<()>;
24
25 fn adding_node_with_data(&self, node: impl AsRef<NodeID>, parent: Option<impl AsRef<NodeID>>, edge: impl AsRef<EdgeID>, node_data: Self::NData) -> Result<Self>
26 where
27 Self: Clone + Sized,
28 {
29 let mut c = self.clone();
30 c.add_node_with_data(node, parent, edge, node_data)?;
31 Ok(c)
32 }
33
34 fn add_node(&mut self, node: impl AsRef<NodeID>, parent: Option<impl AsRef<NodeID>>, edge: impl AsRef<EdgeID>) -> Result<()>
35 where
36 Self::NData: Default
37 {
38 self.add_node_with_data(node, parent, edge, Self::NData::default())
39 }
40
41 fn adding_node(&self, node: impl AsRef<NodeID>, parent: Option<impl AsRef<NodeID>>, edge: impl AsRef<EdgeID>) -> Result<Self>
42 where
43 Self: Clone + Sized,
44 Self::NData: Default
45 {
46 self.adding_node_with_data(node, parent, edge, Self::NData::default())
47 }
48
49 fn moving_node(&self, id: impl AsRef<NodeID>, new_parent: Option<impl AsRef<NodeID>>) -> Result<Self>
50 where
51 Self: Clone + Sized,
52 {
53 let mut c = self.clone();
54 c.move_node(id, new_parent)?;
55 Ok(c)
56 }
57
58 fn removing_node_ungrouping(&self, id: impl AsRef<NodeID>) -> Result<Self>
59 where
60 Self: Clone + Sized,
61 {
62 let mut c = self.clone();
63 c.remove_node_ungrouping(id)?;
64 Ok(c)
65 }
66
67 fn removing_node_and_children(&self, id: impl AsRef<NodeID>) -> Result<Self>
68 where
69 Self: Clone + Sized,
70 {
71 let mut c = self.clone();
72 c.remove_node_and_children(id)?;
73 Ok(c)
74 }
75
76 fn removing_children(&self, id: impl AsRef<NodeID>) -> Result<Self>
77 where
78 Self: Clone + Sized,
79 {
80 let mut c = self.clone();
81 c.remove_children(id)?;
82 Ok(c)
83 }
84
85 fn adding_edge_with_data(&self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>, edge_data: Self::EData) -> Result<Self>
86 where
87 Self: Clone + Sized,
88 {
89 let mut c = self.clone();
90 c.add_edge_with_data(edge, source, target, edge_data)?;
91 Ok(c)
92 }
93
94 fn add_edge(&mut self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>) -> Result<()>
95 where
96 Self::EData: Default
97 {
98 self.add_edge_with_data(edge, source, target, Self::EData::default())
99 }
100
101 fn adding_edge(&self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>) -> Result<Self>
102 where
103 Self: Clone + Sized,
104 Self::EData: Default
105 {
106 self.adding_edge_with_data(edge, source, target, Self::EData::default())
107 }
108
109 fn removing_edge(&self, id: impl AsRef<EdgeID>) -> Result<Self>
110 where
111 Self: Clone + Sized,
112 {
113 let mut c = self.clone();
114 c.remove_edge(id)?;
115 Ok(c)
116 }
117
118 fn clearing_edges(&self, id: impl AsRef<NodeID>) -> Result<Self>
119 where
120 Self: Clone + Sized,
121 {
122 let mut c = self.clone();
123 c.clear_edges(id)?;
124 Ok(c)
125 }
126
127 fn setting_data(&self, data: Self::GData) -> Self
128 where
129 Self: Clone + Sized,
130 {
131 let mut c = self.clone();
132 c.set_data(data);
133 c
134 }
135
136 fn setting_node_data(&self, id: impl AsRef<NodeID>, data: Self::NData) -> Result<Self>
137 where
138 Self: Clone + Sized,
139 {
140 let mut c = self.clone();
141 c.set_node_data(id, data)?;
142 Ok(c)
143 }
144
145 fn setting_edge_data(&self, id: impl AsRef<EdgeID>, data: Self::EData) -> Result<Self>
146 where
147 Self: Clone + Sized,
148 {
149 let mut c = self.clone();
150 c.set_edge_data(id, data)?;
151 Ok(c)
152 }
153}