1use crate::traits::*;
2use core::iter;
3
4pub struct Rev<Seq>(Seq);
5
6impl<Seq> Rev<Seq> {
7 pub(crate) fn new(seq: Seq) -> Self {
8 Self(seq)
9 }
10}
11
12impl<'this, Seq> SequenceTypes<'this> for Rev<Seq>
13where
14 Seq: SequenceTypes<'this>,
15{
16 type Item = Seq::Item;
17 type Iter = iter::Rev<Seq::Iter>;
18}
19
20impl<'this, Seq> MutSequenceTypes<'this> for Rev<Seq>
21where
22 Seq: MutSequenceTypes<'this>,
23{
24 type MutItem = Seq::MutItem;
25 type IterMut = iter::Rev<Seq::IterMut>;
26}
27
28impl<Seq> Sequence for Rev<Seq>
29where
30 Seq: Sequence,
31{
32 #[inline]
33 fn len(&self) -> usize {
34 self.0.len()
35 }
36
37 #[inline]
38 fn is_empty(&self) -> bool {
39 self.0.is_empty()
40 }
41
42 #[inline]
43 fn get(&self, index: usize) -> Option<<Self as SequenceTypes<'_>>::Item> {
44 self.0.rget(index)
45 }
46
47 #[inline]
48 fn rget(&self, rindex: usize) -> Option<<Self as SequenceTypes<'_>>::Item> {
49 self.0.get(rindex)
50 }
51
52 #[inline]
53 fn first(&self) -> Option<<Self as SequenceTypes<'_>>::Item> {
54 self.0.last()
55 }
56
57 #[inline]
58 fn last(&self) -> Option<<Self as SequenceTypes<'_>>::Item> {
59 self.0.first()
60 }
61
62 #[inline]
63 fn iter(&self) -> <Self as SequenceTypes<'_>>::Iter {
64 self.0.iter().rev()
65 }
66
67 #[inline]
68 fn min<'a>(&'a self) -> Option<<Self as SequenceTypes<'a>>::Item>
69 where
70 <Self as SequenceTypes<'a>>::Item: Ord,
71 {
72 self.0.min()
73 }
74
75 #[inline]
76 fn max<'a>(&'a self) -> Option<<Self as SequenceTypes<'a>>::Item>
77 where
78 <Self as SequenceTypes<'a>>::Item: Ord,
79 {
80 self.0.max()
81 }
82}
83
84impl<Seq> MutSequence for Rev<Seq>
85where
86 Seq: MutSequence,
87{
88 #[inline]
89 fn get_mut(&mut self, index: usize) -> Option<<Self as MutSequenceTypes<'_>>::MutItem> {
90 self.0.rget_mut(index)
91 }
92
93 #[inline]
94 fn rget_mut(&mut self, rindex: usize) -> Option<<Self as MutSequenceTypes<'_>>::MutItem> {
95 self.0.get_mut(rindex)
96 }
97
98 #[inline]
99 fn first_mut(&mut self) -> Option<<Self as MutSequenceTypes<'_>>::MutItem> {
100 self.0.last_mut()
101 }
102
103 #[inline]
104 fn last_mut(&mut self) -> Option<<Self as MutSequenceTypes<'_>>::MutItem> {
105 self.0.first_mut()
106 }
107
108 #[inline]
109 fn iter_mut(&mut self) -> <Self as MutSequenceTypes<'_>>::IterMut {
110 self.0.iter_mut().rev()
111 }
112}
113
114unsafe impl<Seq> UniqueSequence for Rev<Seq> where Seq: UniqueSequence {}
116
117#[cfg(test)]
118mod tests {
119 use super::Rev;
120 use crate::traits::*;
121
122 #[test]
123 fn len() {
124 assert_eq!(Rev::new(2..5).len(), 3);
125 }
126
127 #[test]
128 fn is_empty() {
129 assert_eq!(Rev::new(2..5).is_empty(), false);
130 assert_eq!(Rev::new(0..0).is_empty(), true);
131 }
132
133 #[test]
134 fn get() {
135 let x = Rev::new(2..5);
136 assert_eq!(x.get(0), Some(4));
137 assert_eq!(x.get(1), Some(3));
138 assert_eq!(x.get(2), Some(2));
139 assert_eq!(x.get(3), None);
140 }
141
142 #[test]
143 fn rget() {
144 let x = Rev::new(2..5);
145 assert_eq!(x.rget(0), Some(2));
146 assert_eq!(x.rget(1), Some(3));
147 assert_eq!(x.rget(2), Some(4));
148 assert_eq!(x.rget(3), None);
149 }
150
151 #[test]
152 fn first() {
153 assert_eq!(Rev::new(2..5).first(), Some(4));
154 assert_eq!(Rev::new(0..0).first(), None);
155 }
156
157 #[test]
158 fn last() {
159 assert_eq!(Rev::new(2..5).last(), Some(2));
160 assert_eq!(Rev::new(0..0).last(), None);
161 }
162
163 #[test]
164 fn iter() {
165 assert!(Rev::new(2..5).iter().eq(Iterator::rev(2..5)));
166 }
167
168 #[test]
169 fn min() {
170 assert_eq!(Rev::new(2..5).min(), Some(2));
171 assert_eq!(Rev::new(0..0).min(), None);
172 }
173
174 #[test]
175 fn max() {
176 assert_eq!(Rev::new(2..5).max(), Some(4));
177 assert_eq!(Rev::new(0..0).max(), None);
178 }
179
180 #[test]
181 fn get_mut() {
182 let mut x = [2, 3, 4];
183 let mut y = Rev::new(x.as_mut_sqnc());
184 *y.get_mut(0).unwrap() = 7;
185 *y.get_mut(1).unwrap() = 6;
186 *y.get_mut(2).unwrap() = 5;
187 assert!(y.get_mut(3).is_none());
188 assert_eq!(x, [5, 6, 7]);
189 }
190
191 #[test]
192 fn rget_mut() {
193 let mut x = [2, 3, 4];
194 let mut y = Rev::new(x.as_mut_sqnc());
195 *y.rget_mut(0).unwrap() = 5;
196 *y.rget_mut(1).unwrap() = 6;
197 *y.rget_mut(2).unwrap() = 7;
198 assert!(y.rget_mut(3).is_none());
199 assert_eq!(x, [5, 6, 7]);
200 }
201
202 #[test]
203 fn first_mut() {
204 let mut x = [2, 3, 4];
205 let mut y = Rev::new(x.as_mut_sqnc());
206 *y.first_mut().unwrap() = 5;
207 assert_eq!(x, [2, 3, 5]);
208 assert!(Rev::<[usize; 0]>::new([]).first_mut().is_none());
209 }
210
211 #[test]
212 fn last_mut() {
213 let mut x = [2, 3, 4];
214 let mut y = Rev::new(x.as_mut_sqnc());
215 *y.last_mut().unwrap() = 5;
216 assert_eq!(x, [5, 3, 4]);
217 assert!(Rev::<[usize; 0]>::new([]).last_mut().is_none());
218 }
219
220 #[test]
221 fn iter_mut() {
222 let mut x = [2, 3, 4];
223 let mut y = Rev::new(x.as_mut_sqnc());
224 let mut iter = y.iter_mut();
225 *iter.next().unwrap() = 7;
226 *iter.next().unwrap() = 6;
227 *iter.next().unwrap() = 5;
228 assert!(iter.next().is_none());
229 assert_eq!(x, [5, 6, 7]);
230 }
231}