taq 1.2.0

A simple Tokio task abstraction.
Documentation
use taq::TaskManager;

struct Logger {
    count: usize,
}

impl Logger {
    fn new() -> Self {
        Self { count: 0 }
    }

    fn log(&mut self, msg: &str) {
        self.count += 1;
        println!("LOG {}: {}", self.count, msg);
    }
}

#[async_trait::async_trait]
impl taq::Task for Logger {
    async fn task(mut self, mut mgr: TaskManager<Self>) -> Option<()> {
        while let Some(run) = mgr.poll().await {
            run.with(&mut self).await;
        }
        Some(())
    }
}

#[tokio::main]
async fn main() {
    use taq::HandleExt;

    taq::run_global(Logger::new());

    let a = tokio::spawn(async move {
        let handle = taq::global::get_handle::<Logger>().unwrap();

        handle
            .recv(taq::job!(|logger| {
                logger.log("A");
            }))
            .unwrap()
            .await
            .unwrap();
    });

    let b = tokio::spawn(async move {
        let handle = taq::global::get_handle::<Logger>().unwrap();

        handle
            .recv(taq::job!(|logger| {
                logger.log("B");
            }))
            .unwrap()
            .await
            .unwrap();
    });

    let _ = tokio::join!(a, b);
}