use std::collections::HashSet;
use crate::core::compact::compact;
use crate::traversal::global_neighbors::get_global_cell_neighbors;
fn grid_disk_bfs(cell_id: u64, k: usize, edge_only: bool) -> Result<Vec<u64>, String> {
if k == 0 {
return Ok(vec![cell_id]);
}
let mut interior: Vec<u64> = Vec::new();
let mut prev_frontier: HashSet<u64> = HashSet::new();
let mut frontier: HashSet<u64> = HashSet::new();
frontier.insert(cell_id);
for _ring in 1..=k {
let mut next_frontier: HashSet<u64> = HashSet::new();
for &cid in &frontier {
for neighbor in get_global_cell_neighbors(cid, edge_only) {
if !prev_frontier.contains(&neighbor)
&& !frontier.contains(&neighbor)
&& !next_frontier.contains(&neighbor)
{
next_frontier.insert(neighbor);
}
}
}
for &cid in &prev_frontier {
interior.push(cid);
}
if interior.len() > 100 {
interior = compact(&interior)?;
}
prev_frontier = frontier;
frontier = next_frontier;
}
for &cid in &prev_frontier {
interior.push(cid);
}
for &cid in &frontier {
interior.push(cid);
}
compact(&interior)
}
pub fn grid_disk(cell_id: u64, k: usize) -> Result<Vec<u64>, String> {
grid_disk_bfs(cell_id, k, true)
}
pub fn grid_disk_vertex(cell_id: u64, k: usize) -> Result<Vec<u64>, String> {
grid_disk_bfs(cell_id, k, false)
}