iter-builder 0.1.0

Iterator builder with chain calls
Documentation
Iterator builder with chain calls

# Examples

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

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