I believe this can be done with something like

    let mut counted = iter.scan(0, |count, x| { *count += 1; Some(x) });

    for x in counted { ... }

    println!("I saw {} elements", counted.state)


or even just


    let mut count = 0;

    { // scope to restrict the closure's borrow of `count`.
        let mut counted = iter.inspect(|_| count += 1);
        for x in counted { ... }
    }

    println!("I saw {} elements", count);



Huon


On 31/05/14 12:02, Kevin Ballard wrote:
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


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

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

Reply via email to