moduforge_model/ops/
shr.rs

1use std::ops::Shr;
2
3use crate::{
4    error::PoolResult,
5    mark::Mark,
6    node::Node,
7};
8
9use super::{MarkRef, NodeRef};
10
11/// 为 NodeRef 实现自定义的 >> 运算符,用于在子节点列表末尾添加单个节点
12/// 当使用 >> 运算符时,会将新节点添加到当前节点的子节点列表的末尾位置
13impl<'a> Shr<Node> for NodeRef<'a> {
14    type Output = PoolResult<NodeRef<'a>>;
15    fn shr(
16        self,
17        node: Node,
18    ) -> Self::Output {
19        // 添加到末尾(等同于标准的add操作)
20        self.tree.add_node(&self.key.clone().into(), &vec![node])?;
21        Ok(NodeRef::new(self.tree, self.key.clone()))
22    }
23}
24
25/// 为 NodeRef 实现自定义的 >> 运算符,用于在子节点列表末尾添加多个节点
26/// 当使用 >> 运算符时,会将多个新节点添加到当前节点的子节点列表的末尾位置
27impl<'a> Shr<Vec<Node>> for NodeRef<'a> {
28    type Output = PoolResult<NodeRef<'a>>;
29    fn shr(
30        self,
31        nodes: Vec<Node>,
32    ) -> Self::Output {
33        if !nodes.is_empty() {
34            self.tree.add_node(&self.key.clone().into(), &nodes)?;
35        }
36        Ok(NodeRef::new(self.tree, self.key.clone()))
37    }
38}
39
40/// 为 NodeRef 实现自定义的 >> 运算符,用于将当前节点向右移动指定位置
41/// 当使用 >> 运算符时,会将当前节点在其父节点的子节点列表中向右移动指定位置数
42impl<'a> Shr<usize> for NodeRef<'a> {
43    type Output = PoolResult<NodeRef<'a>>;
44    fn shr(
45        self,
46        positions: usize,
47    ) -> Self::Output {
48        // 获取当前节点在父节点中的位置
49        if let Some(parent) = self.tree.get_parent_node(&self.key.clone().into()) {
50            let siblings: im::Vector<String> = self.tree.children(&parent.id).unwrap_or_default();
51            
52            if let Some(current_index) = siblings.iter().position(|id| id.clone() == self.key) {
53                // 计算新位置,不能超过列表长度
54                let max_index = siblings.len().saturating_sub(1);
55                let new_index = (current_index + positions).min(max_index);
56                
57                // 如果位置有变化,执行移动
58                if new_index != current_index {
59                    //这里只需要修改  content 中的顺序就行,不需要删除和添加
60                    let mut node = self.tree.get_node(&self.key.clone().into()).unwrap().as_ref().clone();
61                    let mut content = node.content.clone();
62                    content.swap(current_index, new_index);
63                    node.content = content;
64                    self.tree.update_node(node)?;
65                 }
66            }
67        }
68        
69        Ok(NodeRef::new(self.tree, self.key.clone()))
70    }
71}
72
73/// 为 MarkRef 实现自定义的 >> 运算符,用于在标记列表末尾添加单个标记
74/// 当使用 >> 运算符时,会将新标记添加到当前标记列表的末尾位置
75impl<'a> Shr<Mark> for MarkRef<'a> {
76    type Output = PoolResult<MarkRef<'a>>;
77    fn shr(
78        self,
79        mark: Mark,
80    ) -> Self::Output {
81        // 添加到末尾(等同于标准的add操作)
82        self.tree.add_mark(&self.key.clone().into(), &vec![mark])?;
83        Ok(MarkRef::new(self.tree, self.key.clone()))
84    }
85}
86
87/// 为 MarkRef 实现自定义的 >> 运算符,用于在标记列表末尾添加多个标记
88/// 当使用 >> 运算符时,会将多个新标记添加到当前标记列表的末尾位置
89impl<'a> Shr<Vec<Mark>> for MarkRef<'a> {
90    type Output = PoolResult<MarkRef<'a>>;
91    fn shr(
92        self,
93        marks: Vec<Mark>,
94    ) -> Self::Output {
95        if !marks.is_empty() {
96            self.tree.add_mark(&self.key.clone().into(), &marks)?;
97        }
98        Ok(MarkRef::new(self.tree, self.key.clone()))
99    }
100}
101