//! Iterator utilities. /// Extra methods for iterators. pub trait IteratorExtras: Iterator { /// Create an iterator that produces adjacent pairs of elements from the iterator. fn adjacent_pairs(mut self) -> AdjacentPairs where Self: Sized, Self::Item: Clone { let elem = self.next(); AdjacentPairs { iter: self, elem: elem, } } } impl IteratorExtras for T where T: Iterator {} /// Adjacent pairs iterator returned by `adjacent_pairs()`. /// /// This wraps another iterator and produces a sequence of adjacent pairs of elements. pub struct AdjacentPairs where I: Iterator, I::Item: Clone { iter: I, elem: Option, } impl Iterator for AdjacentPairs where I: Iterator, I::Item: Clone { type Item = (I::Item, I::Item); fn next(&mut self) -> Option { self.elem .take() .and_then(|e| { self.elem = self.iter.next(); self.elem.clone().map(|n| (e, n)) }) } } #[cfg(test)] mod tests { #[test] fn adjpairs() { use super::IteratorExtras; assert_eq!([1, 2, 3, 4] .iter() .cloned() .adjacent_pairs() .collect::>(), vec![(1, 2), (2, 3), (3, 4)]); assert_eq!([2, 3, 4] .iter() .cloned() .adjacent_pairs() .collect::>(), vec![(2, 3), (3, 4)]); assert_eq!([2, 3, 4] .iter() .cloned() .adjacent_pairs() .collect::>(), vec![(2, 3), (3, 4)]); assert_eq!([3, 4] .iter() .cloned() .adjacent_pairs() .collect::>(), vec![(3, 4)]); assert_eq!([4] .iter() .cloned() .adjacent_pairs() .collect::>(), vec![]); assert_eq!([] .iter() .cloned() .adjacent_pairs() .collect::>(), vec![]); } }