Add an iterators module with extra Iterator methods.

Start with an adjacent_pairs() iterator adapter.
This commit is contained in:
Jakob Stoklund Olesen
2017-04-06 13:58:48 -07:00
parent 1440b673fc
commit c6e027207c
2 changed files with 92 additions and 1 deletions

View File

@@ -0,0 +1,90 @@
//! 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<Self>
where Self: Sized,
Self::Item: Clone
{
let elem = self.next();
AdjacentPairs {
iter: self,
elem: elem,
}
}
}
impl<T> 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<I>
where I: Iterator,
I::Item: Clone
{
iter: I,
elem: Option<I::Item>,
}
impl<I> Iterator for AdjacentPairs<I>
where I: Iterator,
I::Item: Clone
{
type Item = (I::Item, I::Item);
fn next(&mut self) -> Option<Self::Item> {
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<_>>(),
vec![(1, 2), (2, 3), (3, 4)]);
assert_eq!([2, 3, 4]
.iter()
.cloned()
.adjacent_pairs()
.collect::<Vec<_>>(),
vec![(2, 3), (3, 4)]);
assert_eq!([2, 3, 4]
.iter()
.cloned()
.adjacent_pairs()
.collect::<Vec<_>>(),
vec![(2, 3), (3, 4)]);
assert_eq!([3, 4]
.iter()
.cloned()
.adjacent_pairs()
.collect::<Vec<_>>(),
vec![(3, 4)]);
assert_eq!([4]
.iter()
.cloned()
.adjacent_pairs()
.collect::<Vec<_>>(),
vec![]);
assert_eq!([]
.iter()
.cloned()
.adjacent_pairs()
.collect::<Vec<(i32, i32)>>(),
vec![]);
}
}

View File

@@ -14,10 +14,10 @@ pub const VERSION: &'static str = env!("CARGO_PKG_VERSION");
pub mod dbg;
pub mod binemit;
pub mod flowgraph;
pub mod dominator_tree;
pub mod entity_list;
pub mod entity_map;
pub mod flowgraph;
pub mod ir;
pub mod isa;
pub mod regalloc;
@@ -28,6 +28,7 @@ pub mod verifier;
mod abi;
mod constant_hash;
mod context;
mod iterators;
mod legalizer;
mod packed_option;
mod partition_slice;