use crate::{
grid::Grid,
point::Point,
search::{SearchRequest, SearchResult},
};
pub trait HierarchicalGridBuilder {
type Map: PreparedHierarchicalGrid;
fn name(&self) -> &'static str;
fn preprocess(&self, grid: &Grid) -> Result<Self::Map, HierarchicalGridBuildError>;
}
pub trait PreparedHierarchicalGrid {
fn name(&self) -> &'static str;
fn search(&self, request: SearchRequest) -> SearchResult;
}
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
#[non_exhaustive]
pub enum HierarchicalGridBuildError {
#[error("HPA* cluster size must be greater than zero")]
InvalidClusterSize,
#[error("HPA* supports only uniform-cost grids; cell {point:?} has traversal cost {cost}")]
NonUniformCost { point: Point, cost: usize },
}