1use std::ops::Sub;
2
3use crate::{
4 error::{PoolResult},
5 mark::Mark,
6 types::NodeId,
7};
8
9use super::{MarkRef, NodeRef};
10
11impl<'a> Sub<NodeId> for NodeRef<'a> {
14 type Output = PoolResult<NodeRef<'a>>;
15 fn sub(
16 self,
17 node_id: NodeId,
18 ) -> Self::Output {
19 self.tree.remove_node(&self.key.clone().into(), vec![node_id])?;
20 Ok(NodeRef::new(self.tree, self.key.clone()))
21 }
22}
23
24impl<'a> Sub<Vec<NodeId>> for NodeRef<'a> {
27 type Output = PoolResult<NodeRef<'a>>;
28 fn sub(
29 self,
30 node_ids: Vec<NodeId>,
31 ) -> Self::Output {
32 self.tree.remove_node(&self.key.clone().into(), node_ids)?;
33 Ok(NodeRef::new(self.tree, self.key.clone()))
34 }
35}
36impl<'a> Sub<usize> for NodeRef<'a> {
39 type Output = PoolResult<NodeRef<'a>>;
40 fn sub(
41 self,
42 index: usize,
43 ) -> Self::Output {
44 self.tree.remove_node_by_index(&self.key.clone().into(), index)?;
45 Ok(NodeRef::new(self.tree, self.key.clone()))
46 }
47}
48impl<'a> Sub<Mark> for MarkRef<'a> {
51 type Output = PoolResult<MarkRef<'a>>;
52 fn sub(
53 self,
54 mark: Mark,
55 ) -> Self::Output {
56 self.tree
57 .remove_mark(&self.key.clone().into(), &[mark.r#type.clone()])?;
58 Ok(MarkRef::new(self.tree, self.key.clone()))
59 }
60}
61
62impl<'a> Sub<String> for MarkRef<'a> {
63 type Output = PoolResult<MarkRef<'a>>;
64 fn sub(
65 self,
66 mark_name: String,
67 ) -> Self::Output {
68 self.tree.remove_mark_by_name(&self.key.clone().into(), &mark_name)?;
69 Ok(MarkRef::new(self.tree, self.key.clone()))
70 }
71}
72impl<'a> Sub<Vec<String>> for MarkRef<'a> {
73 type Output = PoolResult<MarkRef<'a>>;
74 fn sub(
75 self,
76 mark_names: Vec<String>,
77 ) -> Self::Output {
78 self.tree.remove_mark(&self.key.clone().into(), &mark_names)?;
79 Ok(MarkRef::new(self.tree, self.key.clone()))
80 }
81}
82
83impl<'a> Sub<Vec<Mark>> for MarkRef<'a> {
87 type Output = PoolResult<MarkRef<'a>>;
88 fn sub(
89 self,
90 marks: Vec<Mark>,
91 ) -> Self::Output {
92 self.tree.remove_mark(
93 &self.key.clone().into(),
94 &marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>(),
95 )?;
96 Ok(MarkRef::new(self.tree, self.key.clone()))
97 }
98}