use crate::DirectiveAdaptor;
use flume::{Sender, TryRecvError};
use orphan_crippler::Sender as OcSender;
use std::thread;
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) enum DirectiveThreadMessage {
Stop,
}
#[inline]
pub(crate) fn launch_directive_thread<
Dir: Send + 'static,
Da: DirectiveAdaptor<Dir> + Send + 'static,
>(
mut adaptor: Da,
) -> (
Sender<DirectiveThreadMessage>,
Sender<Option<OcSender<Dir>>>,
) {
let (message_sender, message_receiver) = flume::unbounded::<DirectiveThreadMessage>();
let (directive_sender, directive_receiver) = flume::unbounded::<Option<OcSender<Dir>>>();
thread::Builder::new()
.name("directive_thread".to_string())
.spawn(move || loop {
match message_receiver.try_recv() {
Err(TryRecvError::Empty) => (),
Err(TryRecvError::Disconnected) | Ok(DirectiveThreadMessage::Stop) => break,
}
match directive_receiver.recv() {
Err(_) => break,
Ok(None) => (),
Ok(Some(directive)) => adaptor.send(directive),
}
})
.expect("Unable to spawn directive thread");
(message_sender, directive_sender)
}