use std::time::Duration;

use indicatif::ProgressBar;
use tokio::runtime;
use tokio::time::interval;

fn main() {
    // Plain progress bar, totaling 1024 steps.
    let steps = 1024;
    let pb = ProgressBar::new(steps);

    // Stream of events, triggering every 5ms.
    let rt = runtime::Builder::new_current_thread()
        .enable_time()
        .build()
        .expect("failed to create runtime");

    // Future computation which runs for `steps` interval events,
    // incrementing one step of the progress bar each time.
    let future = async {
        let mut intv = interval(Duration::from_millis(5));

        for _ in 0..steps {
            intv.tick().await;
            pb.inc(1);
        }
    };

    // Drive the future to completion, blocking until done.
    rt.block_on(future);

    // Mark the progress bar as finished.
    pb.finish();
}
