1pub struct Slide<'a, T: 'a> {
22 v: &'a [T],
23 pos: usize,
24}
25
26impl<'a, T: Sized> Iterator for Slide<'a, T> {
27 type Item = (&'a T, Option<&'a [T]>);
28
29 #[inline]
30 fn next(&mut self) -> Option<(&'a T, Option<&'a [T]>)> {
31 self.v.get(self.pos).map(|val| {
32 self.pos = self.pos + 1;
33
34 if self.v.len() > self.pos {
35 (val, Some(&self.v[self.pos..]))
36 } else {
37 (val, None)
38 }
39 })
40 }
41
42 #[inline]
43 fn size_hint(&self) -> (usize, Option<usize>) {
44 let diff = self.v.len() - self.pos;
45
46 (diff, Some(diff))
47 }
48}
49
50pub trait Slider<'a, T: Sized> {
52 fn slide(&'a self) -> Slide<'a, T>;
66}
67
68impl<'a, T> Slider<'a, T> for &'a [T] {
69 fn slide(&'a self) -> Slide<'a, T> {
70 Slide { v: self, pos: 0}
71 }
72}
73
74impl<'a, T> Slider<'a, T> for Vec<T> {
75 fn slide(&'a self) -> Slide<'a, T> {
76 Slide { v: &self[..], pos: 0}
77 }
78}
79
80#[cfg(test)]
81mod test {
82 use super::{Slider};
83
84 #[test]
85 fn test_zero() {
86 let v: Vec<u8> = vec![];
87 let mut it = v.slide();
88
89 assert_eq!(it.next(), None);
90 }
91
92 #[test]
93 fn test_one() {
94 let v = vec![1];
95 let mut it = v.slide();
96
97 assert_eq!(it.next(), Some((&1, None)));
98 assert_eq!(it.next(), None);
99 }
100
101 #[test]
102 fn test_two() {
103 let v = vec![1, 2];
104 let mut it = v.slide();
105
106 assert_eq!(it.next(), Some((&1, Some(&[2][..]))));
107 assert_eq!(it.next(), Some((&2, None)));
108 assert_eq!(it.next(), None);
109 }
110
111 #[test]
112 fn test_ten() {
113 let v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
114 let mut it = v.slide();
115
116 assert_eq!(it.next(), Some((&1, Some(&[2, 3, 4, 5, 6, 7, 8, 9, 10][..]))));
117 assert_eq!(it.next(), Some((&2, Some(&[3, 4, 5, 6, 7, 8, 9, 10][..]))));
118 assert_eq!(it.next(), Some((&3, Some(&[4, 5, 6, 7, 8, 9, 10][..]))));
119 assert_eq!(it.next(), Some((&4, Some(&[5, 6, 7, 8, 9, 10][..]))));
120 assert_eq!(it.next(), Some((&5, Some(&[6, 7, 8, 9, 10][..]))));
121 assert_eq!(it.next(), Some((&6, Some(&[7, 8, 9, 10][..]))));
122 assert_eq!(it.next(), Some((&7, Some(&[8, 9, 10][..]))));
123 assert_eq!(it.next(), Some((&8, Some(&[9, 10][..]))));
124 assert_eq!(it.next(), Some((&9, Some(&[10][..]))));
125 assert_eq!(it.next(), Some((&10, None)));
126 assert_eq!(it.next(), None);
127 }
128}