use crate::{error::EyeError, types::NodeMatrixRow, YedadEyeProvider};
use futures::future::join_all;
use std::sync::Arc;
pub struct EyeAggregator {
provider: Arc<dyn YedadEyeProvider>,
}
impl EyeAggregator {
pub fn new(provider: Arc<dyn YedadEyeProvider>) -> Self {
Self { provider }
}
pub async fn reconstruct_matrix(&self) -> Result<Vec<NodeMatrixRow>, EyeError> {
let addresses = self.provider.fetch_all_active_addresses().await?;
let futures: Vec<_> = addresses
.iter()
.map(|addr| {
let p = self.provider.clone();
let a = addr.clone();
tokio::spawn(async move { p.fetch_node_row(&a).await })
})
.collect();
let results = join_all(futures).await;
let mut matrix = Vec::new();
for res in results {
if let Ok(Ok(row)) = res {
matrix.push(row);
}
}
matrix.sort_by(|a, b| a.address.cmp(&b.address));
Ok(matrix)
}
}