use crate::qtty::Radians;
use super::record::{inside_cone, passes_filter, CatalogFilter, CatalogRecord};
#[derive(Debug, Default, Clone)]
pub struct LargeStarCatalog {
records: Vec<CatalogRecord>,
}
impl LargeStarCatalog {
pub fn new() -> Self {
Self::default()
}
pub fn len(&self) -> usize {
self.records.len()
}
pub fn is_empty(&self) -> bool {
self.records.is_empty()
}
pub fn push(&mut self, record: CatalogRecord) {
self.records.push(record);
}
pub fn extend(&mut self, iter: impl IntoIterator<Item = CatalogRecord>) {
self.records.extend(iter);
}
pub fn records(&self) -> &[CatalogRecord] {
&self.records
}
pub fn cone_search(
&self,
center_ra: Radians,
center_dec: Radians,
radius: Radians,
filter: CatalogFilter,
) -> Vec<&CatalogRecord> {
self.records
.iter()
.filter(|r| {
inside_cone(r.ra, r.dec, center_ra, center_dec, radius) && passes_filter(r, &filter)
})
.collect()
}
pub fn cone_search_at_epoch(
&self,
center_ra: Radians,
center_dec: Radians,
radius: Radians,
target_epoch_jyr: f64,
filter: CatalogFilter,
) -> Vec<&CatalogRecord> {
self.records
.iter()
.filter(|r| {
let (ra, dec) = r.propagate_to(target_epoch_jyr);
inside_cone(ra, dec, center_ra, center_dec, radius) && passes_filter(r, &filter)
})
.collect()
}
pub fn cone_search_chunked(
&self,
center_ra: Radians,
center_dec: Radians,
radius: Radians,
filter: CatalogFilter,
chunk_size: usize,
) -> impl Iterator<Item = Vec<&CatalogRecord>> {
let chunks = self.records.chunks(chunk_size.max(1));
chunks.map(move |chunk| {
chunk
.iter()
.filter(|r| {
inside_cone(r.ra, r.dec, center_ra, center_dec, radius)
&& passes_filter(r, &filter)
})
.collect()
})
}
}