iter-builder 0.1.0

Iterator builder with chain calls
Documentation
  • Coverage
  • 45.16%
    14 out of 31 items documented7 out of 28 items with examples
  • Size
  • Source code size: 22.59 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 4.57 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Links
  • A4-Tacks/iter-builder-rs
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • A4-Tacks

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);