moduforge_model/ops/
mul.rs1use std::ops::Mul;
2
3use crate::{error::PoolResult, id_generator::IdGenerator, types::NodeId};
4
5use super::NodeRef;
6
7impl<'a> Mul<usize> for NodeRef<'a> {
10 type Output = PoolResult<NodeRef<'a>>;
11 fn mul(
12 self,
13 count: usize,
14 ) -> Self::Output {
15 if let Some(current_node) = self.tree.get_node(&self.key.clone().into())
17 {
18 let mut nodes = Vec::new();
19 for _ in 0..count {
20 let mut node = current_node.as_ref().clone();
22 node.id = IdGenerator::get_id();
23 node.content = im::Vector::new();
24 nodes.push(node);
25 }
26 if let Some(parent) =
28 self.tree.get_parent_node(&self.key.clone().into())
29 {
30 self.tree.add_node(&parent.id, &nodes)?;
31 }
32 }
33 Ok(NodeRef::new(self.tree, self.key.clone()))
34 }
35}
36
37impl<'a> Mul<NodeId> for NodeRef<'a> {
40 type Output = PoolResult<NodeRef<'a>>;
41 fn mul(
42 self,
43 node_id: NodeId,
44 ) -> Self::Output {
45 if let Some(source_node) = self.tree.get_node(&node_id) {
47 let mut node = source_node.as_ref().clone();
48 node.id = IdGenerator::get_id();
49 node.content = im::Vector::new();
50 self.tree.add_node(&self.key.clone().into(), &vec![node])?;
52 }
53 Ok(NodeRef::new(self.tree, self.key.clone()))
54 }
55}
56
57impl<'a> Mul<Vec<NodeId>> for NodeRef<'a> {
60 type Output = PoolResult<NodeRef<'a>>;
61 fn mul(
62 self,
63 node_ids: Vec<NodeId>,
64 ) -> Self::Output {
65 let mut cloned_nodes = Vec::new();
66
67 for node_id in node_ids {
68 if let Some(source_node) = self.tree.get_node(&node_id) {
69 let mut node = source_node.as_ref().clone();
70 node.id = IdGenerator::get_id();
71 node.content = im::Vector::new();
72 cloned_nodes.push(node);
73 }
74 }
75
76 if !cloned_nodes.is_empty() {
77 self.tree.add_node(&self.key.clone().into(), &cloned_nodes)?;
78 }
79
80 Ok(NodeRef::new(self.tree, self.key.clone()))
81 }
82}