use rustc_hash::FxHashSet;
use super::edge::EdgeStore;
use super::traversal::{bfs_traverse, bfs_traverse_reverse, TraversalConfig, TraversalResult};
#[must_use]
pub fn bfs_traverse_both(
edge_store: &EdgeStore,
source_id: u64,
config: &TraversalConfig,
) -> Vec<TraversalResult> {
let mut results = Vec::new();
let half_limit = config.limit / 2 + 1;
let config_half = TraversalConfig {
limit: half_limit,
..config.clone()
};
let forward = bfs_traverse(edge_store, source_id, &config_half);
let seen: FxHashSet<u64> = forward.iter().map(|r| r.target_id).collect();
results.extend(forward);
if results.len() < config.limit {
let reverse = bfs_traverse_reverse(edge_store, source_id, &config_half);
for r in reverse {
if results.len() >= config.limit {
break;
}
if !seen.contains(&r.target_id) {
results.push(r);
}
}
}
results.truncate(config.limit);
results
}