Expand description
Iterator builder with chain calls
§Examples
use iter_builder::Iter as IterBuilder;
let iter = IterBuilder::new((0, 3), |(a, b)| {
let i = *a;
if i < *b {
*a += 1;
Some(i)
} else {
None
}
})
.size_hint(|(a, b)| (b-a, Some(b-a)))
.next_back(|(a, b)| {
if *a < *b {
*b -= 1;
Some(*b)
} else {
None
}
})
.fused()
.exact()
.finish();
let mut iter1 = iter.clone();
assert_eq!(iter1.size_hint(), (3, Some(3)));
assert_eq!(iter1.next(), Some(0));
assert_eq!(iter1.next(), Some(1));
assert_eq!(iter1.size_hint(), (1, Some(1)));
assert_eq!(iter1.next(), Some(2));
assert_eq!(iter1.next(), None);
assert_eq!(iter1.next(), None);
assert_eq!(iter1.size_hint(), (0, Some(0)));
let mut iter2 = iter.clone();
assert_eq!(iter2.size_hint(), (3, Some(3)));
assert_eq!(iter2.next(), Some(0));
assert_eq!(iter2.size_hint(), (2, Some(2)));
assert_eq!(iter2.next_back(), Some(2));
assert_eq!(iter2.size_hint(), (1, Some(1)));
assert_eq!(iter2.next(), Some(1));
assert_eq!(iter2.size_hint(), (0, Some(0)));
assert_eq!(iter2.next(), None);
assert_eq!(iter2.next_back(), None);
assert_eq!(iter2.size_hint(), (0, Some(0)));use iter_builder::Iter as IterBuilder;
fn range(lo: usize, hi: usize) -> impl DoubleEndedIterator<Item = usize> + ExactSizeIterator {
IterBuilder::new((lo, hi), |(lo, hi)| {
if lo >= hi { None? }
let i = *lo;
*lo += 1;
Some(i)
}).next_back(|(lo, hi)| {
if lo >= hi { None? }
*hi -= 1;
Some(*hi)
}).size_hint(|(lo, hi)| {
(hi-lo, Some(hi-lo))
}).fused().exact().finish()
}
let vec = range(1, 4).collect::<Vec<_>>();
assert_eq!(vec, vec![1, 2, 3]);
let vec = range(1, 4).rev().collect::<Vec<_>>();
assert_eq!(vec, vec![3, 2, 1]);
assert_eq!(range(0, 3).len(), 3);
assert_eq!(range(1, 4).len(), 3);