coordinator 0.1.1

Coordinator is a library to load balance tasks into task runners
Documentation
use coordinator::{Coordinator, JoinHandle, TaskPrefs, TaskProcessor};
use std::time::Duration;
use tracing::{debug, level_filters::LevelFilter};

struct Worker(String);
impl TaskProcessor<i32> for Worker {
    type Output = i32;
    async fn do_work(&mut self, task: i32) -> Self::Output {
        tokio::time::sleep(Duration::from_secs(1)).await;
        println!("Task {} computed {}", self.0, task * 2);
        task * 2
    }
}

#[tokio::main]
async fn main() {
    let subscriber = tracing_subscriber::fmt()
        .with_file(true)
        .with_line_number(true)
        .with_thread_ids(true)
        .with_target(false)
        .with_max_level(LevelFilter::DEBUG)
        .finish();
    tracing::subscriber::set_global_default(subscriber).unwrap();

    let b = Coordinator::new(3);
    b.add_worker("Worker 1st", Worker("Worker 1st".to_string()))
        .await;
    b.add_worker("Worker 5th", |x| async move { x * 2 }).await;
    debug!("wakldna");
    let _ = b.run(2, TaskPrefs::Any).await.unwrap();
    let x = b.run(4, TaskPrefs::Any).await.unwrap();
    let _ = b.run(6, TaskPrefs::Any).await.unwrap();
    let rs = x.join().await.unwrap();
    dbg!(rs);

    for x in 10..20 {
        b.run(x, TaskPrefs::Preferred("Worker 4th")).await.unwrap();
    }

    loop {
        tokio::time::sleep(Duration::from_secs(1)).await;
    }
}