use std::sync::mpsc::{self, Receiver, Sender};
use std::thread;
use crate::CancelToken;
#[derive(Debug)]
pub struct AgentRun<Event> {
events: Receiver<Event>,
cancel: CancelToken,
}
impl<Event: Send + 'static> AgentRun<Event> {
pub fn spawn(cancel: CancelToken, run: impl FnOnce(Sender<Event>, CancelToken) + Send + 'static) -> Self {
let thread_cancel = cancel.clone();
let (sender, events) = mpsc::channel();
thread::spawn(move || run(sender, thread_cancel));
Self { events, cancel }
}
pub fn into_events(self) -> Receiver<Event> {
self.events
}
pub fn cancel(&self) -> &CancelToken {
&self.cancel
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn run_exposes_events_and_the_shared_cancel_token() {
let cancel = CancelToken::new();
let run = AgentRun::spawn(cancel, |sender, received_cancel| {
sender.send(received_cancel.is_cancelled()).expect("send event");
});
assert!(!run.cancel().is_cancelled());
assert!(!run.into_events().recv().expect("receive event"));
}
}