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