mf_model/ops/
shl.rs

1use std::ops::Shl;
2
3use crate::{error::PoolResult, error_helpers, node::Node};
4
5use super::{NodeRef};
6
7/// 为 NodeRef 实现自定义的 << 运算符,用于在子节点列表开头插入单个节点
8/// 当使用 << 运算符时,会将新节点插入到当前节点的子节点列表的开头位置
9impl<'a> Shl<Node> for NodeRef<'a> {
10    type Output = PoolResult<NodeRef<'a>>;
11    fn shl(
12        self,
13        node: Node,
14    ) -> Self::Output {
15        // 在索引0处插入节点(开头位置)
16        self.tree.add_at_index(&self.key.clone(), 0, &node)?;
17        Ok(NodeRef::new(self.tree, self.key.clone()))
18    }
19}
20
21/// 为 NodeRef 实现自定义的 << 运算符,用于在子节点列表开头插入多个节点
22/// 当使用 << 运算符时,会将多个新节点依次插入到当前节点的子节点列表的开头位置
23impl<'a> Shl<Vec<Node>> for NodeRef<'a> {
24    type Output = PoolResult<NodeRef<'a>>;
25    fn shl(
26        self,
27        nodes: Vec<Node>,
28    ) -> Self::Output {
29        // 反向插入,确保节点顺序正确
30        for (i, node) in nodes.into_iter().enumerate() {
31            self.tree.add_at_index(&self.key.clone(), i, &node)?;
32        }
33        Ok(NodeRef::new(self.tree, self.key.clone()))
34    }
35}
36
37/// 为 NodeRef 实现自定义的 << 运算符,用于在指定数量的位置处插入节点
38/// 当使用 << 运算符时,会将当前节点向左移动指定位置数
39impl<'a> Shl<usize> for NodeRef<'a> {
40    type Output = PoolResult<NodeRef<'a>>;
41    fn shl(
42        self,
43        positions: usize,
44    ) -> Self::Output {
45        // 获取当前节点在父节点中的位置
46        if let Some(parent) = self.tree.get_parent_node(&self.key.clone()) {
47            let siblings = self.tree.children(&parent.id).unwrap_or_default();
48
49            if let Some(current_index) =
50                siblings.iter().position(|id| id.clone() == self.key)
51            {
52                // 计算新位置,不能小于0
53                let new_index = current_index.saturating_sub(positions);
54
55                // 如果位置有变化,执行移动
56                if new_index != current_index {
57                    //这里只需要修改  content 中的顺序就行,不需要删除和添加
58
59                    let node = {
60                        let node = {
61                            match self.tree.get_node(&self.key.clone()) {
62                                Some(n) => n,
63                                None => {
64                                    return Err(error_helpers::node_not_found(
65                                        self.key.clone(),
66                                    ));
67                                },
68                            }
69                        };
70                        match node.swap(current_index, new_index) {
71                            Some(n) => n,
72                            None => return Err(anyhow::anyhow!("下标越界了")),
73                        }
74                    };
75                    self.tree.update_node(node)?;
76                }
77            }
78        }
79
80        Ok(NodeRef::new(self.tree, self.key.clone()))
81    }
82}