1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
pub struct AdjacentPairs<IteratorType: Iterator<Item = ItemType>, ItemType: Clone> {
iterator: IteratorType,
last_item: Option<ItemType>,
}
impl<IteratorType: Iterator<Item = ItemType>, ItemType: Clone> AdjacentPairs<IteratorType, ItemType> {
fn new(iterator: IteratorType) -> AdjacentPairs<IteratorType, ItemType> {
AdjacentPairs {
iterator,
last_item: None,
}
}
}
impl<IteratorType: Iterator<Item = ItemType>, ItemType: Clone> Iterator for AdjacentPairs<IteratorType, ItemType> {
type Item = (ItemType, ItemType);
fn next(&mut self) -> Option<Self::Item> {
let last_item = match self.last_item.take() {
Some(item) => item,
None => self.iterator.next()?,
};
let current_item = self.iterator.next()?;
self.last_item = Some(current_item.clone());
Some((last_item, current_item))
}
}
pub trait AdjacentPairIterator {
type Item: Clone;
type Iterator: Iterator<Item = Self::Item>;
fn adjacent_pairs(self) -> AdjacentPairs<Self::Iterator, Self::Item>;
}
impl<IteratorType: Iterator<Item = ItemType>, ItemType: Clone> AdjacentPairIterator for IteratorType {
type Item = ItemType;
type Iterator = Self;
fn adjacent_pairs(self) -> AdjacentPairs<Self::Iterator, Self::Item> {
AdjacentPairs::new(self)
}
}
#[cfg(test)]
mod tests {
use crate::AdjacentPairIterator;
#[test]
fn should_provide_nothing_without_items() {
let array: [i32; 0] = [];
let mut iterator = array.iter().adjacent_pairs();
assert_eq!(None, iterator.next());
}
#[test]
fn should_provide_nothing_for_only_one_input() {
let array = [1];
let mut iterator = array.iter().adjacent_pairs();
assert_eq!(None, iterator.next());
}
#[test]
fn should_provide_pair_for_two_inputs() {
let array = [1, 2];
let mut iterator = array.iter().adjacent_pairs();
assert_eq!(Some((&1, &2)), iterator.next());
assert_eq!(None, iterator.next());
}
#[test]
fn should_provide_two_pairs_for_three_inputs() {
let array = [1, 2, 3];
let mut iterator = array.iter().adjacent_pairs();
assert_eq!(Some((&1, &2)), iterator.next());
assert_eq!(Some((&2, &3)), iterator.next());
assert_eq!(None, iterator.next());
}
#[test]
fn should_provide_many_pairs() {
let array = [1, 2, 3, 4, 5, 6];
let mut iterator = array.iter().adjacent_pairs();
assert_eq!(Some((&1, &2)), iterator.next());
assert_eq!(Some((&2, &3)), iterator.next());
assert_eq!(Some((&3, &4)), iterator.next());
assert_eq!(Some((&4, &5)), iterator.next());
assert_eq!(Some((&5, &6)), iterator.next());
assert_eq!(None, iterator.next());
}
#[test]
fn should_work_with_into_iterator() {
let vector = vec![1, 2, 3];
let mut iterator = vector.into_iter().adjacent_pairs();
assert_eq!(Some((1, 2)), iterator.next());
assert_eq!(Some((2, 3)), iterator.next());
assert_eq!(None, iterator.next());
}
}