use std::collections::HashMap;
use crate::bounds::combine_parallel_sets;
use crate::client::proto::common::{
metrics::Bounds as PbBounds, microgrid::electrical_components::ElectricalComponentTelemetry,
};
use crate::{Bounds, metric::Metric};
pub(crate) fn aggregate_parallel<M: Metric>(
components: &HashMap<u64, ElectricalComponentTelemetry>,
) -> Vec<Bounds<M::QuantityType>>
where
Bounds<M::QuantityType>: From<PbBounds>,
{
components
.values()
.filter_map(extract_metric_bounds::<M>)
.fold(Vec::new(), |acc, bounds| {
combine_parallel_sets(&acc, &bounds)
})
}
fn extract_metric_bounds<M: Metric>(
telemetry: &ElectricalComponentTelemetry,
) -> Option<Vec<Bounds<M::QuantityType>>>
where
Bounds<M::QuantityType>: From<PbBounds>,
{
telemetry.metric_samples.iter().find_map(|sample| {
(sample.metric == M::METRIC as i32).then(|| {
sample
.bounds
.iter()
.map(|b| Bounds::from(*b))
.collect::<Vec<_>>()
})
})
}