#[derive(Debug)]
pub struct Compression<'a, T> {
pub size: usize,
pub sorted_array: Vec<&'a T>,
}
impl<'a, T: Ord> Compression<'a, T> {
pub fn new(array: &'a [T]) -> Self {
array.iter().collect()
}
pub fn idx(&self, val: &T) -> Option<usize> {
let idx = self.sorted_array.binary_search(&val);
if let Ok(idx) = idx {
Some(idx)
} else {
None
}
}
pub fn val(&self, idx: usize) -> Option<&T> {
if let Some(&val) = self.sorted_array.get(idx) {
Some(val)
} else {
None
}
}
}
impl<'a, T: Ord> FromIterator<&'a T> for Compression<'a, T> {
fn from_iter<I: IntoIterator<Item = &'a T>>(iter: I) -> Self {
let mut comp: Vec<&'a T> = iter.into_iter().collect();
comp.sort();
comp.dedup();
Self {
size: comp.len(),
sorted_array: comp,
}
}
}