use std::sync::{Arc, Mutex};
#[derive(Clone)]
pub struct Parameter<const N: usize> {
values: Arc<Mutex<[f64; N]>>,
}
impl<const N: usize> Parameter<N> {
pub fn new(initial_values: [f64; N]) -> Self {
Self {
values: Arc::new(Mutex::new(initial_values)),
}
}
pub fn deep_clone(&self) -> Self {
Self {
values: Arc::new(Mutex::new(self.get())),
}
}
pub fn get(&self) -> [f64; N] {
match self.values.lock() {
Ok(guard) => *guard,
Err(poisoned) => *poisoned.into_inner(),
}
}
pub fn set(&self, new_values: [f64; N]) {
let mut guard = match self.values.lock() {
Ok(guard) => guard,
Err(poisoned) => poisoned.into_inner(),
};
*guard = new_values;
}
}
impl<const N: usize> std::fmt::Debug for Parameter<N> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let values = self.get();
write!(f, "Parameter({:?})", values)
}
}