vigilant_lamp/extra/
iter_range.rs

1use std::iter::{Skip};
2
3pub struct RangedIterator<A: Iterator> {
4    parent: A,
5    remaining: usize
6}
7
8impl<A: Iterator> RangedIterator<A> {
9    pub fn new (parent: A, from: usize, to: usize) -> RangedIterator<Skip<A>> {
10        RangedIterator { parent: parent.skip(from), remaining: to - from }
11    }
12
13    pub fn limit (parent: A, len: usize) -> RangedIterator<A> {
14        RangedIterator { parent, remaining: len }
15    }
16}
17
18impl<A: Iterator> Iterator for RangedIterator<A> {
19    type Item = A::Item;
20
21    fn next (&mut self) -> Option<Self::Item> {
22        if self.remaining <= 0 {
23            return None
24        }
25
26        self.remaining -= 1;
27        self.parent.next()
28    }
29}