Skip to main content

object_rainbow/
sequence.rs

1use 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> {}