use std::sync::Arc;
use std::thread::JoinHandle;
use bevy_ecs::prelude::Resource;
use retiretui_engine::market::Progress;
pub(crate) struct Worker<T> {
handle: Option<JoinHandle<T>>,
pub(crate) progress: Arc<Progress>,
}
impl<T: Send + 'static> Worker<T> {
pub(crate) fn spawn(work: impl FnOnce(&Progress) -> T + Send + 'static) -> Self {
let progress = Arc::new(Progress::default());
let shared = Arc::clone(&progress);
let handle = std::thread::spawn(move || work(&shared));
Self {
handle: Some(handle),
progress,
}
}
}
impl<T> Worker<T> {
pub(crate) fn is_finished(&self) -> bool {
self.handle.as_ref().is_some_and(JoinHandle::is_finished)
}
pub(crate) fn join(mut self) -> Option<T> {
self.handle.take()?.join().ok()
}
}
impl<T> Drop for Worker<T> {
fn drop(&mut self) {
self.progress.cancel();
}
}
#[derive(Resource, Clone, Copy, Debug)]
pub struct Searches(pub bool);
impl Default for Searches {
fn default() -> Self {
Self(true)
}
}