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, vec![node_id])?;
20 Ok(NodeRef::new(self.tree, self.key))
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(), 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(), 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.remove_mark(&self.key.clone(), &[mark.r#type.clone()])?;
57 Ok(MarkRef::new(self.tree, self.key.clone()))
58 }
59}
60
61impl<'a> Sub<String> for MarkRef<'a> {
62 type Output = PoolResult<MarkRef<'a>>;
63 fn sub(
64 self,
65 mark_name: String,
66 ) -> Self::Output {
67 self.tree.remove_mark_by_name(&self.key.clone(), &mark_name)?;
68 Ok(MarkRef::new(self.tree, self.key.clone()))
69 }
70}
71impl<'a> Sub<Vec<String>> for MarkRef<'a> {
72 type Output = PoolResult<MarkRef<'a>>;
73 fn sub(
74 self,
75 mark_names: Vec<String>,
76 ) -> Self::Output {
77 self.tree.remove_mark(&self.key.clone(), &mark_names)?;
78 Ok(MarkRef::new(self.tree, self.key.clone()))
79 }
80}