use crate::error::Result;
use super::Candidate;
use std::collections::BinaryHeap;
pub struct MultiLevelSearch;
impl MultiLevelSearch {
pub fn new() -> Self {
Self
}
pub fn merge(
&self,
fresh: Vec<Candidate>,
l1: Vec<Candidate>,
l2: Vec<Candidate>,
k: usize,
) -> Result<Vec<Candidate>> {
let mut heap = BinaryHeap::new();
for c in fresh {
heap.push(std::cmp::Reverse(c));
}
for c in l1 {
heap.push(std::cmp::Reverse(c));
}
for c in l2 {
heap.push(std::cmp::Reverse(c));
}
let mut result = Vec::new();
let mut seen = std::collections::HashSet::new();
while let Some(std::cmp::Reverse(candidate)) = heap.pop() {
if seen.contains(&candidate.id) {
continue;
}
seen.insert(candidate.id);
result.push(candidate);
if result.len() >= k {
break;
}
}
Ok(result)
}
}
impl Default for MultiLevelSearch {
fn default() -> Self {
Self::new()
}
}