Documentation
use std::{
    io::{self, BufWriter, Write},
    sync::{
        atomic::{AtomicBool, Ordering},
        Arc,
    },
    time::{Duration, Instant},
};

use tokio::time::sleep;

use crate::defer::Defer;
pub struct Bar {
    switch: Arc<AtomicBool>,
}
impl Bar {
    pub fn close(&mut self) {
        self.switch.fetch_and(false, Ordering::Relaxed);
    }
}

impl Drop for Bar {
    fn drop(&mut self) {
        self.close()
    }
}

pub fn print_use_time(pre: &str) -> Bar {
    let now = Instant::now();
    let bar = Arc::new(AtomicBool::new(true));
    let arc = bar.clone();
    let pre = pre.to_string();
    let dlab=pre.clone();
    tokio::spawn(async move {
        let _defer = Defer(move ||{
            let mut sw = BufWriter::new(io::stdout());
            let str = format!("{dlab}{:?}", now.elapsed());
            sw.write_fmt(format_args!("\r{str}\n")).unwrap();
            sw.flush().unwrap();
        });

        let mut sw = BufWriter::new(io::stdout());
        while arc.load(Ordering::Relaxed) {
            let str = format!("{pre}{:?}", now.elapsed());
            sw.write_fmt(format_args!("\r{str}")).unwrap();
            sw.flush().unwrap();
            sleep(Duration::from_millis(400)).await;
        }
      
    });
    Bar { switch: bar }
}