use crate::{Candidate, CandidateId};
use geo::{MultiPoint, Point};
use rayon::prelude::*;
use routers_network::Entry;
use scc::HashMap;
pub struct Layer {
pub nodes: Vec<CandidateId>,
pub origin: Point,
}
impl Layer {
pub fn geometry<E: Entry>(
&self,
lookup: &HashMap<CandidateId, Candidate<E>>,
) -> MultiPoint<f64> {
self.nodes
.iter()
.filter_map(|id| lookup.get(id))
.map(|candidate| candidate.position)
.collect::<MultiPoint<_>>()
}
}
#[derive(Default)]
pub struct Layers {
pub layers: Vec<Layer>,
}
impl Layers {
pub fn last(&self) -> Option<&Layer> {
self.layers.last()
}
pub fn first(&self) -> Option<&Layer> {
self.layers.first()
}
pub fn geometry<E: Entry>(
&self,
lookup: &scc::HashMap<CandidateId, Candidate<E>>,
) -> MultiPoint<f64> {
self.layers
.iter()
.flat_map(|layer| layer.geometry(lookup).0)
.collect::<MultiPoint<_>>()
}
}
impl FromParallelIterator<Layer> for Layers {
fn from_par_iter<I>(layers: I) -> Self
where
I: IntoParallelIterator<Item = Layer>,
{
let layers = layers.into_par_iter().collect::<Vec<Layer>>();
Self { layers }
}
}