use super::SpatialGrid;
use crate::errors::RSCMResult;
use crate::timeseries::FloatValue;
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ScalarRegion {
Global = 0,
}
impl From<ScalarRegion> for usize {
fn from(r: ScalarRegion) -> usize {
r as usize
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub struct ScalarGrid;
impl SpatialGrid for ScalarGrid {
fn grid_name(&self) -> &'static str {
"Scalar"
}
fn size(&self) -> usize {
1
}
fn region_names(&self) -> &[String] {
static NAMES: std::sync::OnceLock<Vec<String>> = std::sync::OnceLock::new();
NAMES.get_or_init(|| vec!["Global".to_string()])
}
fn aggregate_global(&self, values: &[FloatValue]) -> FloatValue {
assert_eq!(values.len(), 1, "ScalarGrid expects exactly 1 value");
values[0]
}
fn transform_to<G: SpatialGrid>(
&self,
values: &[FloatValue],
target: &G,
) -> RSCMResult<Vec<FloatValue>> {
assert_eq!(
values.len(),
self.size(),
"Values length must match grid size"
);
match target.size() {
1 => Ok(values.to_vec()), _ => {
Ok(vec![values[0]; target.size()])
}
}
}
}