argparse_rs/
slide.rs

1//! This module defines a  `Slide` iterator over `Vector`s and slices
2
3/// Immutable iterator that returns both an element, and slice
4/// representing the remaining elements
5///
6/// This iterator will not return an empty slice upon reaching the
7/// last element, but will instead return a `None` instead of a
8/// `Some(&[..])`
9/// # Example
10/// ```
11/// use argparse::slide::{Slide, Slider};
12///
13/// let v = vec![1, 2, 3, 4, 5];
14///
15/// for (x, opt_rest) in v.slide() {
16///     if let Some(rest) = opt_rest {
17///         println!("{}", x + rest[0]) // rest guaranteed at least 1 element
18///     }
19/// }
20/// ```
21pub 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
50/// Interface for all types that can produce a `Slide` iterator
51pub trait Slider<'a, T: Sized> {
52    /// Calling this method shall produce a `Slide` iterator
53    /// # Example
54    /// ```
55    /// use argparse::slide::{Slide, Slider};
56    ///
57    /// let v = vec![1, 2, 3, 4, 5];
58    ///
59    /// for (x, opt_rest) in v.slide() {
60    ///     if let Some(rest) = opt_rest {
61    ///         println!("{}", x + rest[0]) // rest guaranteed at least 1 element
62    ///     }
63    /// }
64    /// ```
65    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}