use anyhow::Result;
use crate::{EdgeID, NodeID, Nodes, VisitableCompound};
pub trait MutableCompound: VisitableCompound {
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<()>;
fn move_node(&mut self, id: impl AsRef<NodeID>, new_parent: Option<impl AsRef<NodeID>>) -> Result<()>;
fn remove_node_ungrouping(&mut self, id: impl AsRef<NodeID>) -> Result<()>;
fn remove_node_and_children(&mut self, id: impl AsRef<NodeID>) -> Result<Nodes>;
fn remove_children(&mut self, id: impl AsRef<NodeID>) -> Result<Nodes>;
fn add_edge_with_data(&mut self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>, edge_data: Self::EData) -> Result<()>;
fn remove_edge(&mut self, id: impl AsRef<EdgeID>) -> Result<()>;
fn clear_edges(&mut self, id: impl AsRef<NodeID>) -> Result<()>;
fn move_edge(&mut self, id: impl AsRef<EdgeID>, new_source: impl AsRef<NodeID>, new_target: impl AsRef<NodeID>) -> Result<()>;
fn set_data(&mut self, data: Self::GData);
fn set_node_data(&mut self, id: impl AsRef<NodeID>, data: Self::NData) -> Result<()>;
fn set_edge_data(&mut self, id: impl AsRef<EdgeID>, data: Self::EData) -> Result<()>;
fn with_data(&mut self, transform: &dyn Fn(&mut Self::GData));
fn with_node_data(&mut self, id: impl AsRef<NodeID>, transform: &dyn Fn(&mut Self::NData)) -> Result<()>;
fn with_edge_data(&mut self, id: impl AsRef<EdgeID>, transform: &dyn Fn(&mut Self::EData)) -> Result<()>;
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>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.add_node_with_data(node, parent, edge, node_data)?;
Ok(c)
}
fn add_node(&mut self, node: impl AsRef<NodeID>, parent: Option<impl AsRef<NodeID>>, edge: impl AsRef<EdgeID>) -> Result<()>
where
Self::NData: Default
{
self.add_node_with_data(node, parent, edge, Self::NData::default())
}
fn adding_node(&self, node: impl AsRef<NodeID>, parent: Option<impl AsRef<NodeID>>, edge: impl AsRef<EdgeID>) -> Result<Self>
where
Self: Clone + Sized,
Self::NData: Default
{
self.adding_node_with_data(node, parent, edge, Self::NData::default())
}
fn moving_node(&self, id: impl AsRef<NodeID>, new_parent: Option<impl AsRef<NodeID>>) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.move_node(id, new_parent)?;
Ok(c)
}
fn removing_node_ungrouping(&self, id: impl AsRef<NodeID>) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.remove_node_ungrouping(id)?;
Ok(c)
}
fn removing_node_and_children(&self, id: impl AsRef<NodeID>) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.remove_node_and_children(id)?;
Ok(c)
}
fn removing_children(&self, id: impl AsRef<NodeID>) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.remove_children(id)?;
Ok(c)
}
fn adding_edge_with_data(&self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>, edge_data: Self::EData) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.add_edge_with_data(edge, source, target, edge_data)?;
Ok(c)
}
fn add_edge(&mut self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>) -> Result<()>
where
Self::EData: Default
{
self.add_edge_with_data(edge, source, target, Self::EData::default())
}
fn adding_edge(&self, edge: impl AsRef<EdgeID>, source: impl AsRef<NodeID>, target: impl AsRef<NodeID>) -> Result<Self>
where
Self: Clone + Sized,
Self::EData: Default
{
self.adding_edge_with_data(edge, source, target, Self::EData::default())
}
fn removing_edge(&self, id: impl AsRef<EdgeID>) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.remove_edge(id)?;
Ok(c)
}
fn clearing_edges(&self, id: impl AsRef<NodeID>) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.clear_edges(id)?;
Ok(c)
}
fn setting_data(&self, data: Self::GData) -> Self
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.set_data(data);
c
}
fn setting_node_data(&self, id: impl AsRef<NodeID>, data: Self::NData) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.set_node_data(id, data)?;
Ok(c)
}
fn setting_edge_data(&self, id: impl AsRef<EdgeID>, data: Self::EData) -> Result<Self>
where
Self: Clone + Sized,
{
let mut c = self.clone();
c.set_edge_data(id, data)?;
Ok(c)
}
}