use crate::lib::*;
use crate::node::_Node;
#[cfg(feature = "auto_id")]
use crate::node::GENERATOR;
#[cfg(feature = "auto_id")]
use sequential_gen::prelude::Generator;
#[cfg(feature = "serde")]
use ::serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Eq)]
pub struct Node<Q, T>(Rc<RefCell<_Node<Q, T>>>)
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone;
impl<Q, T> Node<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
pub fn new(node_id: Q, value: Option<T>) -> Self {
Node(Rc::new(RefCell::new(_Node {
node_id,
value,
children: vec![],
parent: None,
})))
}
pub fn add_child(&self, child: Node<Q, T>) -> crate::prelude::Result<()> {
{
let mut node = self.0.borrow_mut();
node.children.push(child.get_node_id()?);
}
let mut child = child.0.borrow_mut();
child.parent = Some(self.get_node_id()?);
Ok(())
}
pub fn remove_child(&self, child: Node<Q, T>) -> crate::prelude::Result<()> {
let mut node = self.0.borrow_mut();
node.children.retain(|x| {
x != &child
.get_node_id()
.expect("Error: Could not fetch id of Node.")
});
let mut child = child.0.borrow_mut();
child.parent = None;
Ok(())
}
pub fn get_node_id(&self) -> crate::prelude::Result<Q> {
Ok(self.0.borrow().node_id.clone())
}
pub fn get_children_ids(&self) -> crate::prelude::Result<Vec<Q>> {
Ok(self.0.borrow().children.clone())
}
pub fn get_parent_id(&self) -> crate::prelude::Result<Option<Q>> {
Ok(self.0.borrow().parent.clone())
}
pub fn get_value(&self) -> crate::prelude::Result<Option<T>> {
Ok(self.0.borrow().value.clone())
}
pub fn set_value(&self, value: Option<T>) -> crate::prelude::Result<()> {
self.0.borrow_mut().value = value;
Ok(())
}
pub fn update_value(
&self,
modifier: impl FnOnce(&mut Option<T>),
) -> crate::prelude::Result<()> {
let mut node = self.0.borrow_mut();
modifier(&mut node.value);
Ok(())
}
pub fn set_parent(&self, parent: Option<Node<Q, T>>) -> crate::prelude::Result<()> {
if let Some(parent) = parent.as_ref() {
parent.add_child(self.clone())?;
}
self.0.borrow_mut().parent =
parent.map(|x| x.get_node_id().expect("Error: Could not fetch id of Node."));
Ok(())
}
pub fn sort_children(&self, compare: impl Fn(&Q, &Q) -> Ordering) -> crate::prelude::Result<()>
where
Q: Debug,
{
let mut children = self.0.borrow().children.clone();
children.sort_by(|a, b| compare(a, b));
self.update_children(children)?;
Ok(())
}
fn update_children(&self, update: impl AsRef<[Q]>) -> crate::prelude::Result<()> {
let children = &mut self.0.borrow_mut().children;
children.clear();
children.extend_from_slice(update.as_ref());
Ok(())
}
}
impl<Q, T> PartialEq for Node<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
fn eq(&self, other: &Self) -> bool {
self.get_node_id() == other.get_node_id() && self.get_value() == other.get_value()
}
}
impl<Q, T> Display for Node<Q, T>
where
Q: PartialEq + Eq + Clone + Display,
T: PartialEq + Eq + Clone + Display + Default,
{
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
#[cfg(feature = "print_node_id")]
return write!(
f,
"{}: {}",
self.get_node_id()
.expect("Error: Could not fetch id of Node."),
self.get_value()
.expect("Error: Could not fetch value of Node.")
.as_ref()
.cloned()
.unwrap_or_default()
);
#[cfg(not(feature = "print_node_id"))]
write!(
f,
"{}",
self.get_value()
.expect("Error: Could not fetch value of Node.")
.as_ref()
.cloned()
.unwrap_or_default()
)
}
}
impl<Q, T> Hash for Node<Q, T>
where
Q: PartialEq + Eq + Clone + Hash,
T: PartialEq + Eq + Clone + Hash,
{
fn hash<H: Hasher>(&self, state: &mut H) {
self.get_node_id()
.expect("Error: Could not fetch id of Node.")
.hash(state);
self.get_value()
.expect("Error: Could not fetch value of Node.")
.hash(state);
self.get_children_ids()
.expect("Error: Could not fetch the children ids of the Node.")
.hash(state);
self.get_parent_id()
.expect("Error: Could not fetch the parent id of the Node.")
.hash(state);
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Nodes<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
nodes: Vec<Node<Q, T>>,
index: usize,
}
impl<Q, T> Nodes<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
pub fn new(nodes: Vec<Node<Q, T>>) -> Self {
Nodes { nodes, index: 0 }
}
pub fn iter(&self) -> Iter<'_, Node<Q, T>> {
self.nodes.iter()
}
pub fn len(&self) -> usize {
self.nodes.len()
}
pub fn is_empty(&self) -> bool {
self.nodes.is_empty()
}
pub fn get(&self, index: usize) -> Option<&Node<Q, T>> {
self.nodes.get(index)
}
pub fn get_by_node_id(&self, node_id: &Q) -> Option<&Node<Q, T>> {
self.nodes.iter().find(|x| {
&x.get_node_id()
.expect("Error: Could not get teh id of the node")
== node_id
})
}
pub fn push(&mut self, node: Node<Q, T>) {
self.nodes.push(node);
}
pub fn remove(&mut self, index: usize) -> Node<Q, T> {
self.nodes.remove(index)
}
pub fn retain<F>(&mut self, f: F)
where
F: FnMut(&Node<Q, T>) -> bool,
{
self.nodes.retain(f);
}
pub fn clear(&mut self) {
self.nodes.clear();
}
pub fn append(&mut self, other: &mut Self) {
self.nodes.append(&mut other.nodes);
}
pub fn append_raw(&mut self, other: &mut Vec<Node<Q, T>>) {
self.nodes.append(other);
}
pub fn first(&self) -> Option<&Node<Q, T>> {
self.nodes.first()
}
}
impl<Q, T> AsRef<Nodes<Q, T>> for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
fn as_ref(&self) -> &Nodes<Q, T> {
self
}
}
impl<Q, T> FromIterator<Node<Q, T>> for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
fn from_iter<I: IntoIterator<Item = Node<Q, T>>>(iter: I) -> Self {
Nodes::new(iter.into_iter().collect())
}
}
impl<Q, T> Iterator for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
type Item = Node<Q, T>;
#[allow(clippy::iter_next_slice)]
fn next(&mut self) -> Option<Self::Item> {
let node = self.nodes.get(self.index).cloned();
self.index += 1;
node
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.nodes.iter().size_hint()
}
}
impl<Q, T> Default for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone,
T: PartialEq + Eq + Clone,
{
fn default() -> Self {
Nodes::new(vec![])
}
}
impl<Q, T> Display for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone + Display,
T: PartialEq + Eq + Clone + Display + Default,
{
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
for node in self.iter() {
write!(f, "{node}")?;
}
Ok(())
}
}
#[cfg(feature = "serde")]
impl<Q, T> Serialize for Node<Q, T>
where
Q: PartialEq + Eq + Clone + Serialize,
T: PartialEq + Eq + Clone + Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.borrow().serialize(serializer)
}
}
#[cfg(feature = "serde")]
impl<'de, Q, T> Deserialize<'de> for Node<Q, T>
where
Q: PartialEq + Eq + Clone + Deserialize<'de>,
T: PartialEq + Eq + Clone + Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let node: _Node<Q, T> = Deserialize::deserialize(deserializer)?;
Ok(Node(Rc::new(RefCell::new(node))))
}
}
#[cfg(feature = "serde")]
impl<Q, T> Serialize for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone + Serialize,
T: PartialEq + Eq + Clone + Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.nodes.serialize(serializer)
}
}
#[cfg(feature = "serde")]
impl<'de, Q, T> Deserialize<'de> for Nodes<Q, T>
where
Q: PartialEq + Eq + Clone + Deserialize<'de>,
T: PartialEq + Eq + Clone + Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let nodes: Vec<Node<Q, T>> = Deserialize::deserialize(deserializer)?;
if cfg!(feature = "compact_serde") {
for node in nodes.iter() {
if let Some(parent_node_id) = node
.get_parent_id()
.expect("Error: Could not fetch parent id of Node.")
{
if let Some(parent_node) = nodes.iter().find(|x| {
x.get_node_id()
.expect("Error: Could not fetch the node id.")
== parent_node_id
}) {
parent_node
.add_child(node.clone())
.expect("Error: Could not add child to Node.");
}
}
}
return Ok(Nodes::new(nodes));
}
Ok(Nodes::new(nodes))
}
}
#[cfg(feature = "auto_id")]
impl<Q, T> Node<Q, T>
where
Q: PartialEq + Eq + Clone + From<u128>,
T: PartialEq + Eq + Clone,
{
pub fn new_with_auto_id(value: Option<T>) -> Self {
Self(Rc::new(RefCell::new(_Node {
node_id: Q::from(GENERATOR.generate()),
value,
children: vec![],
parent: None,
})))
}
}