acts 0.17.2

a fast, lightweight, extensiable workflow engine
Documentation
use crate::scheduler::queue::Signal;
use std::sync::Arc;
use tokio::{runtime::Handle, sync::Mutex, sync::mpsc};

#[derive(Clone)]
pub struct Queue {
    receiver: Arc<Mutex<mpsc::Receiver<Signal>>>,
    sender: Arc<mpsc::Sender<Signal>>,
}

impl Queue {
    pub fn new() -> Arc<Self> {
        let (tx, rx) = mpsc::channel::<Signal>(100);

        Arc::new(Self {
            receiver: Arc::new(Mutex::new(rx)),
            sender: Arc::new(tx),
        })
    }

    pub async fn next(&self) -> Option<Signal> {
        let receiver = &mut *self.receiver.lock().await;
        receiver.recv().await
    }

    pub(crate) fn send(&self, sig: &Signal) {
        let sender = self.sender.clone();
        let sig = sig.clone();
        Handle::current().spawn(async move { sender.send(sig).await });
    }

    pub fn terminate(&self) {
        self.send(&Signal::Terminal);
    }
}