use std::sync::Arc;
use std::sync::Condvar;
use std::sync::Mutex;
use std::sync::atomic::AtomicBool;
use serde::Deserialize;
use serde::Serialize;
use crate::compute::state::State;
use crate::symbolic::core::Expr;
pub type Value = String;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ComputationStatus {
Pending,
Running,
Paused,
Completed,
Failed(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComputationProgress {
pub percentage: f32,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Computation {
pub id: String,
pub expr: Arc<Expr>,
pub status: ComputationStatus,
pub progress: ComputationProgress,
pub result: Option<Value>,
pub state: State,
#[serde(skip, default = "default_pause")]
pub pause: Arc<(Mutex<bool>, Condvar)>,
#[serde(skip, default = "default_cancel_signal")]
pub cancel_signal: Arc<AtomicBool>,
}
pub(crate) fn default_pause() -> Arc<(Mutex<bool>, Condvar)> {
Arc::new((Mutex::new(false), Condvar::new()))
}
fn default_cancel_signal() -> Arc<AtomicBool> {
Arc::new(AtomicBool::new(false))
}