taskflow-rs 0.1.1

A high-performance, async-first task orchestration framework for Rust
Documentation
use std::collections::HashSet;
use std::sync::Arc;
use tokio::sync::{Notify, RwLock};

#[derive(Clone)]
pub struct TaskExecutor {
    running_tasks: Arc<RwLock<HashSet<String>>>,
    shutdown_signal: Arc<Notify>,
}

impl TaskExecutor {
    pub fn new() -> Self {
        Self {
            running_tasks: Arc::new(RwLock::new(HashSet::new())),
            shutdown_signal: Arc::new(Notify::new()),
        }
    }

    pub async fn add_running_task(&self, task_id: String) {
        let mut running = self.running_tasks.write().await;
        running.insert(task_id);
    }

    pub async fn remove_running_task(&self, task_id: &str) {
        let mut running = self.running_tasks.write().await;
        running.remove(task_id);
    }

    pub async fn running_count(&self) -> usize {
        let running = self.running_tasks.read().await;
        running.len()
    }

    pub async fn is_empty(&self) -> bool {
        let running = self.running_tasks.read().await;
        running.is_empty()
    }

    pub fn shutdown(&self) {
        self.shutdown_signal.notify_waiters();
    }

    pub fn wait_for_shutdown(&self) -> &Notify {
        &self.shutdown_signal
    }

    pub async fn wait_for_running_tasks(&self) {
        while !self.is_empty().await {
            tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
        }
    }
}