use color_processing::Color;
#[derive(Default)]
pub struct Region {
data: Vec<(Color, usize)>,
}
impl Region {
pub fn new() -> Self {
Self { data: Vec::new() }
}
pub fn average_color(&self) -> Color {
let sum_color = self.data.iter().fold((0.0, 0.0, 0.0), |sums, x| {
let x = x.0.get_laba();
(sums.0 + x.0, sums.1 + x.1, sums.2 + x.2)
});
let average_color = (
sum_color.0 / self.data.len() as f64,
sum_color.1 / self.data.len() as f64,
sum_color.2 / self.data.len() as f64,
);
Color::new_lab(average_color.0, average_color.1, average_color.2)
}
pub fn sort_by_frequency(&mut self) {
self.data.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap());
}
pub fn push(&mut self, color: Color, count: usize) {
self.data.push((color, count))
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn iter<'s>(&'s self) -> impl Iterator<Item = &(Color, usize)> + 's {
self.data.iter()
}
pub fn len(&self) -> usize {
self.data.len()
}
}
impl std::ops::Index<usize> for Region {
type Output = (Color, usize);
fn index(&self, idx: usize) -> &(Color, usize) {
&self.data[idx]
}
}