moduforge_model/ops/
shr.rs1use std::ops::Shr;
2
3use crate::{error::PoolResult, 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().into(), &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().into(), &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) =
46 self.tree.get_parent_node(&self.key.clone().into())
47 {
48 let siblings: im::Vector<String> =
49 self.tree.children(&parent.id).unwrap_or_default();
50
51 if let Some(current_index) =
52 siblings.iter().position(|id| id.clone() == self.key)
53 {
54 let max_index = siblings.len().saturating_sub(1);
56 let new_index = (current_index + positions).min(max_index);
57
58 if new_index != current_index {
60 let mut node = self
62 .tree
63 .get_node(&self.key.clone().into())
64 .unwrap()
65 .as_ref()
66 .clone();
67 let mut content = node.content.clone();
68 content.swap(current_index, new_index);
69 node.content = content;
70 self.tree.update_node(node)?;
71 }
72 }
73 }
74
75 Ok(NodeRef::new(self.tree, self.key.clone()))
76 }
77}
78
79impl<'a> Shr<Mark> for MarkRef<'a> {
82 type Output = PoolResult<MarkRef<'a>>;
83 fn shr(
84 self,
85 mark: Mark,
86 ) -> Self::Output {
87 self.tree.add_mark(&self.key.clone().into(), &vec![mark])?;
89 Ok(MarkRef::new(self.tree, self.key.clone()))
90 }
91}
92
93impl<'a> Shr<Vec<Mark>> for MarkRef<'a> {
96 type Output = PoolResult<MarkRef<'a>>;
97 fn shr(
98 self,
99 marks: Vec<Mark>,
100 ) -> Self::Output {
101 if !marks.is_empty() {
102 self.tree.add_mark(&self.key.clone().into(), &marks)?;
103 }
104 Ok(MarkRef::new(self.tree, self.key.clone()))
105 }
106}