moduforge_model/ops/
mul.rs

1use std::ops::Mul;
2
3use crate::{error::PoolResult, id_generator::IdGenerator, types::NodeId};
4
5use super::NodeRef;
6
7/// 为 NodeRef 实现自定义的 * 运算符,用于复制当前节点N次
8/// 当使用 * 运算符时,会将当前节点复制指定次数并添加到父节点中
9impl<'a> Mul<usize> for NodeRef<'a> {
10    type Output = PoolResult<NodeRef<'a>>;
11    fn mul(
12        self,
13        count: usize,
14    ) -> Self::Output {
15        // 获取当前节点
16        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                // 创建节点的副本
21                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            // 添加到当前节点的父节点中
27            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
37/// 为 NodeRef 实现自定义的 * 运算符,用于复制指定节点到当前位置
38/// 当使用 * 运算符时,会将指定节点复制到当前节点的子节点列表中
39impl<'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        // 获取要复制的节点
46        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            // 添加到当前节点
51            self.tree.add_node(&self.key.clone().into(), &vec![node])?;
52        }
53        Ok(NodeRef::new(self.tree, self.key.clone()))
54    }
55}
56
57/// 为 NodeRef 实现自定义的 * 运算符,用于批量复制多个指定节点
58/// 当使用 * 运算符时,会将指定的多个节点复制到当前节点的子节点列表中
59impl<'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}