iter-progress 0.5.0

Calculate progress of your iterators
Documentation

iter-progress

Build Status Crates.io Documentation

Wrap an iterator, and get progress data as it's executed. A more advanced .enumerate()

Documentation

Usage

Call .progress() on any Iterator, and get a new iterator that yields (ProgressRecord, T), where T is the original value. A ProgressRecord has many helpful methods to query the current state of the iterator

Example

use iter_progress::ProgressableIter;
// Create an iterator that goes from 0 to 1,000
let my_iter = 0..1_000;
let mut progressor = my_iter.progress();

// This new iterator returns a struct with the current state, and the inner object returned by
// the iterator
let (state, number) = progressor.next().unwrap();
assert_eq!(number, 0);

// We can now use methods on `state` to find out about this object

// If we know the size of the iterator, we can query how far we are through it
// How far through the iterator are we. 0 to 1
assert_eq!(state.fraction(), Some(0.001));

// We are 0.1% the way through
assert_eq!(state.percent(), Some(0.1));

Another usage:

use iter_progress::ProgressableIter;

for (state, val) in my_big_vec.iter().progress() {
    // Every 1 second, execute this function with the the `state`
    state.do_every_n_sec(1. |state| {
       println!("{}% the way though, and doing {} per sec.", state.percent().unwrap(), state.rate()));
    });

    // Do something to process `val`
}

.do_every_n_sec is a "best effort" attempt. It's single threaded, so will be called if the last time that was called was more than N sec ago. .do_every_n_items is called every N items.