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