I suspect a more generally interesting solution would be a Counted iterator 
adaptor that keeps track of how many non-None values it's returned from next(). 
You could use this to validate that your Take iterator returned the expected 
number of values.

pub struct Counted<T> {
    iter: T,
    /// Incremented by 1 every time `next()` returns a non-`None` value
    pub count: uint
}

impl<A, T: Iterator<A>> Iterator<A> for Counted<T> {
    fn next(&mut self) -> Option<A> {
        match self.iter.next() {
            x@Some(_) => {
                self.count += 1;
                x
            }
            None => None
        }
    }
    
    fn size_hint(&self) -> (uint, Option<uint>) {
        self.iter.size_hint()
    }
}

// plus various associated traits like DoubleEndedIterator

-Kevin

On May 30, 2014, at 9:31 AM, Andrew Poelstra <[email protected]> wrote:

> Hi guys,
> 
> 
> Take is an iterator adaptor which cuts off the contained iterator after
> some number of elements, always returning None.
> 
> I find that I need to detect whether I'm getting None from a Take
> iterator because I've read all of the elements I expected or because the
> underlying iterator ran dry unexpectedly. (Specifically, I'm parsing
> some data from the network and want to detect an early EOM.)
> 
> 
> This seems like it might be only me, so I'm posing this to the list: if
> there was a function Take::is_done(&self) -> bool, which returned whether
> or not the Take had returned as many elements as it could, would that be
> generally useful?
> 
> I'm happy to submit a PR but want to check that this is appropriate for
> the standard library.
> 
> 
> 
> Thanks
> 
> Andrew
> 
> 
> 
> -- 
> Andrew Poelstra
> Mathematics Department, University of Texas at Austin
> Email: apoelstra at wpsoftware.net
> Web:   http://www.wpsoftware.net/andrew
> 
> "If they had taught a class on how to be the kind of citizen Dick Cheney
> worries about, I would have finished high school."   --Edward Snowden
> 
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to