1use crate::alloc::vec::Vec;
2use crate::collections::{BTreeMap, BTreeSet};
3
4pub trait Merge: Default {
6 fn merge(&mut self, other: Self);
8
9 fn is_empty(&self) -> bool;
11
12 fn take(&mut self) -> Option<Self> {
14 if self.is_empty() {
15 None
16 } else {
17 Some(core::mem::take(self))
18 }
19 }
20}
21
22impl<K: Ord, V> Merge for BTreeMap<K, V> {
23 fn merge(&mut self, other: Self) {
24 BTreeMap::extend(self, other)
27 }
28
29 fn is_empty(&self) -> bool {
30 BTreeMap::is_empty(self)
31 }
32}
33
34impl<T: Ord> Merge for BTreeSet<T> {
35 fn merge(&mut self, other: Self) {
36 BTreeSet::extend(self, other)
39 }
40
41 fn is_empty(&self) -> bool {
42 BTreeSet::is_empty(self)
43 }
44}
45
46impl<T> Merge for Vec<T> {
47 fn merge(&mut self, mut other: Self) {
48 Vec::append(self, &mut other)
49 }
50
51 fn is_empty(&self) -> bool {
52 Vec::is_empty(self)
53 }
54}
55
56macro_rules! impl_merge_for_tuple {
57 ($($a:ident $b:tt)*) => {
58 impl<$($a),*> Merge for ($($a,)*) where $($a: Merge),* {
59
60 fn merge(&mut self, _other: Self) {
61 $(Merge::merge(&mut self.$b, _other.$b) );*
62 }
63
64 fn is_empty(&self) -> bool {
65 $(Merge::is_empty(&self.$b) && )* true
66 }
67 }
68 }
69}
70
71impl_merge_for_tuple!();
72impl_merge_for_tuple!(T0 0);
73impl_merge_for_tuple!(T0 0 T1 1);
74impl_merge_for_tuple!(T0 0 T1 1 T2 2);
75impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3);
76impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4);
77impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5);
78impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6);
79impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7);
80impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7 T8 8);
81impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7 T8 8 T9 9);
82impl_merge_for_tuple!(T0 0 T1 1 T2 2 T3 3 T4 4 T5 5 T6 6 T7 7 T8 8 T9 9 T10 10);