wolf_graph/traits/
mutable_compound.rs

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}