object_rainbow/
sequence.rs1use crate::*;
2
3#[derive(Debug, Clone, Copy, Default)]
4pub struct Sequence<T>(pub T);
5
6impl<T> PartialEq for Sequence<T>
7where
8 for<'a> &'a T: IntoIterator<Item: PartialEq>,
9{
10 fn eq(&self, other: &Self) -> bool {
11 self.into_iter().eq(other)
12 }
13}
14
15impl<T> Eq for Sequence<T> where for<'a> &'a T: IntoIterator<Item: Eq> {}
16
17impl<T> PartialOrd for Sequence<T>
18where
19 for<'a> &'a T: IntoIterator<Item: PartialOrd>,
20{
21 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
22 self.into_iter().partial_cmp(other)
23 }
24}
25
26impl<T> Ord for Sequence<T>
27where
28 for<'a> &'a T: IntoIterator<Item: Ord>,
29{
30 fn cmp(&self, other: &Self) -> Ordering {
31 self.into_iter().cmp(other)
32 }
33}
34
35impl<T> Deref for Sequence<T> {
36 type Target = T;
37
38 fn deref(&self) -> &Self::Target {
39 &self.0
40 }
41}
42
43impl<T> DerefMut for Sequence<T> {
44 fn deref_mut(&mut self) -> &mut Self::Target {
45 &mut self.0
46 }
47}
48
49impl<T: FromIterator<A>, A> FromIterator<A> for Sequence<T> {
50 fn from_iter<I: IntoIterator<Item = A>>(iter: I) -> Self {
51 Self(iter.into_iter().collect())
52 }
53}
54
55impl<T: IntoIterator> IntoIterator for Sequence<T> {
56 type Item = T::Item;
57
58 type IntoIter = T::IntoIter;
59
60 fn into_iter(self) -> Self::IntoIter {
61 self.0.into_iter()
62 }
63}
64
65impl<'a, T> IntoIterator for &'a Sequence<T>
66where
67 &'a T: IntoIterator,
68{
69 type Item = <&'a T as IntoIterator>::Item;
70
71 type IntoIter = <&'a T as IntoIterator>::IntoIter;
72
73 fn into_iter(self) -> Self::IntoIter {
74 self.0.into_iter()
75 }
76}
77
78impl<'a, T> IntoIterator for &'a mut Sequence<T>
79where
80 &'a mut T: IntoIterator,
81{
82 type Item = <&'a mut T as IntoIterator>::Item;
83
84 type IntoIter = <&'a mut T as IntoIterator>::IntoIter;
85
86 fn into_iter(self) -> Self::IntoIter {
87 self.0.into_iter()
88 }
89}
90
91impl<T> ToOutput for Sequence<T>
92where
93 for<'a> &'a T: IntoIterator<Item: InlineOutput>,
94{
95 fn to_output(&self, output: &mut impl Output) {
96 self.iter_to_output(output);
97 }
98}
99
100impl<T> ByteOrd for Sequence<T>
101where
102 for<'a> &'a T: IntoIterator<Item: ByteOrd + InlineOutput>,
103{
104 fn bytes_cmp(&self, other: &Self) -> Ordering {
105 self.iter_bytes_cmp(other)
106 }
107}
108
109impl<T> ListHashes for Sequence<T>
110where
111 for<'a> &'a T: IntoIterator<Item: ListHashes>,
112{
113 fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
114 self.iter_list_hashes(f);
115 }
116}
117
118impl<T> Topological for Sequence<T>
119where
120 for<'a> &'a T: IntoIterator<Item: Topological>,
121{
122 fn traverse(&self, visitor: &mut impl PointVisitor) {
123 self.iter_traverse(visitor);
124 }
125}
126
127impl<T: IntoIterator<Item = A> + FromIterator<A>, A: ParseInline<I>, I: ParseInput> Parse<I>
128 for Sequence<T>
129{
130 fn parse(input: I) -> crate::Result<Self> {
131 Ok(Self(input.parse_collect()?))
132 }
133}
134
135pub trait PlainCollection: IntoIterator {}
136
137impl<T: IntoIterator> PlainCollection for Sequence<T> {}
138
139pub trait VecLike: PlainCollection {}
140
141impl<T: IntoIterator> VecLike for Sequence<T> {}