1use std::ops::Shr;
2
3use crate::{error::PoolResult, error_helpers, mark::Mark, node::Node};
4
5use super::{MarkRef, NodeRef};
6
7impl<'a> Shr<Node> for NodeRef<'a> {
10 type Output = PoolResult<NodeRef<'a>>;
11 fn shr(
12 self,
13 node: Node,
14 ) -> Self::Output {
15 self.tree.add_node(&self.key.clone(), &vec![node])?;
17 Ok(NodeRef::new(self.tree, self.key.clone()))
18 }
19}
20
21impl<'a> Shr<Vec<Node>> for NodeRef<'a> {
24 type Output = PoolResult<NodeRef<'a>>;
25 fn shr(
26 self,
27 nodes: Vec<Node>,
28 ) -> Self::Output {
29 if !nodes.is_empty() {
30 self.tree.add_node(&self.key.clone(), &nodes)?;
31 }
32 Ok(NodeRef::new(self.tree, self.key.clone()))
33 }
34}
35
36impl<'a> Shr<usize> for NodeRef<'a> {
39 type Output = PoolResult<NodeRef<'a>>;
40 fn shr(
41 self,
42 positions: usize,
43 ) -> Self::Output {
44 if let Some(parent) = self.tree.get_parent_node(&self.key.clone()) {
46 let siblings = self.tree.children(&parent.id).unwrap_or_default();
47
48 if let Some(current_index) =
49 siblings.iter().position(|id| id.clone() == self.key)
50 {
51 let max_index = siblings.len().saturating_sub(1);
53 let new_index = (current_index + positions).min(max_index);
54
55 if new_index != current_index {
57 let node = {
59 let node = {
60 match self.tree.get_node(&self.key.clone()) {
61 Some(n) => n,
62 None => {
63 return Err(error_helpers::node_not_found(
64 self.key.clone(),
65 ));
66 },
67 }
68 };
69 match node.swap(current_index, new_index) {
70 Some(n) => n,
71 None => return Err(anyhow::anyhow!("下标越界了")),
72 }
73 };
74 self.tree.update_node(node)?;
75 }
76 }
77 }
78
79 Ok(NodeRef::new(self.tree, self.key.clone()))
80 }
81}
82
83impl<'a> Shr<Mark> for MarkRef<'a> {
86 type Output = PoolResult<MarkRef<'a>>;
87 fn shr(
88 self,
89 mark: Mark,
90 ) -> Self::Output {
91 self.tree.add_mark(&self.key.clone(), &[mark])?;
93 Ok(MarkRef::new(self.tree, self.key.clone()))
94 }
95}
96
97impl<'a> Shr<Vec<Mark>> for MarkRef<'a> {
100 type Output = PoolResult<MarkRef<'a>>;
101 fn shr(
102 self,
103 marks: Vec<Mark>,
104 ) -> Self::Output {
105 if !marks.is_empty() {
106 self.tree.add_mark(&self.key.clone(), &marks)?;
107 }
108 Ok(MarkRef::new(self.tree, self.key.clone()))
109 }
110}