moduforge_model/ops/
shr.rs1use std::ops::Shr;
2
3use crate::{
4 error::PoolResult,
5 mark::Mark,
6 node::Node,
7};
8
9use super::{MarkRef, NodeRef};
10
11impl<'a> Shr<Node> for NodeRef<'a> {
14 type Output = PoolResult<NodeRef<'a>>;
15 fn shr(
16 self,
17 node: Node,
18 ) -> Self::Output {
19 self.tree.add_node(&self.key.clone().into(), &vec![node])?;
21 Ok(NodeRef::new(self.tree, self.key.clone()))
22 }
23}
24
25impl<'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
40impl<'a> Shr<usize> for NodeRef<'a> {
43 type Output = PoolResult<NodeRef<'a>>;
44 fn shr(
45 self,
46 positions: usize,
47 ) -> Self::Output {
48 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 let max_index = siblings.len().saturating_sub(1);
55 let new_index = (current_index + positions).min(max_index);
56
57 if new_index != current_index {
59 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
73impl<'a> Shr<Mark> for MarkRef<'a> {
76 type Output = PoolResult<MarkRef<'a>>;
77 fn shr(
78 self,
79 mark: Mark,
80 ) -> Self::Output {
81 self.tree.add_mark(&self.key.clone().into(), &vec![mark])?;
83 Ok(MarkRef::new(self.tree, self.key.clone()))
84 }
85}
86
87impl<'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