use std::ops::Mul;
use crate::{error::PoolResult, id_generator::IdGenerator, types::NodeId};
use super::NodeRef;
impl<'a> Mul<usize> for NodeRef<'a> {
type Output = PoolResult<NodeRef<'a>>;
fn mul(
self,
count: usize,
) -> Self::Output {
if let Some(current_node) = self.tree.get_node(&self.key.clone().into())
{
let mut nodes = Vec::new();
for _ in 0..count {
let mut node = current_node.as_ref().clone();
node.id = IdGenerator::get_id();
node.content = im::Vector::new();
nodes.push(node);
}
if let Some(parent) =
self.tree.get_parent_node(&self.key.clone().into())
{
self.tree.add_node(&parent.id, &nodes)?;
}
}
Ok(NodeRef::new(self.tree, self.key.clone()))
}
}
impl<'a> Mul<NodeId> for NodeRef<'a> {
type Output = PoolResult<NodeRef<'a>>;
fn mul(
self,
node_id: NodeId,
) -> Self::Output {
if let Some(source_node) = self.tree.get_node(&node_id) {
let mut node = source_node.as_ref().clone();
node.id = IdGenerator::get_id();
node.content = im::Vector::new();
self.tree.add_node(&self.key.clone().into(), &vec![node])?;
}
Ok(NodeRef::new(self.tree, self.key.clone()))
}
}
impl<'a> Mul<Vec<NodeId>> for NodeRef<'a> {
type Output = PoolResult<NodeRef<'a>>;
fn mul(
self,
node_ids: Vec<NodeId>,
) -> Self::Output {
let mut cloned_nodes = Vec::new();
for node_id in node_ids {
if let Some(source_node) = self.tree.get_node(&node_id) {
let mut node = source_node.as_ref().clone();
node.id = IdGenerator::get_id();
node.content = im::Vector::new();
cloned_nodes.push(node);
}
}
if !cloned_nodes.is_empty() {
self.tree.add_node(&self.key.clone().into(), &cloned_nodes)?;
}
Ok(NodeRef::new(self.tree, self.key.clone()))
}
}