use std::collections::HashMap;
use crate::model::ScoredItem;
pub(crate) fn deduplicate(
scored: Vec<ScoredItem>,
enabled: bool,
) -> (Vec<ScoredItem>, Vec<ScoredItem>) {
if !enabled || scored.is_empty() {
return (scored, vec![]);
}
let mut best_by_content: HashMap<String, usize> = HashMap::new();
for (i, si) in scored.iter().enumerate() {
let content = si.item.content().to_owned();
match best_by_content.get(&content) {
Some(&existing_idx) => {
if si.score > scored[existing_idx].score {
best_by_content.insert(content, i);
}
}
None => {
best_by_content.insert(content, i);
}
}
}
let (survivors, excluded): (Vec<_>, Vec<_>) = scored
.into_iter()
.enumerate()
.partition(|(i, si)| best_by_content.get(si.item.content()) == Some(i));
(
survivors.into_iter().map(|(_, si)| si).collect(),
excluded.into_iter().map(|(_, si)| si).collect(),
)
}