pub trait SearchProblem {
type Node: Hash + PartialEq + Eq;
type Cost: PartialOrd + Zero + Clone;
type Iter: Iterator<Item = (Self::Node, Self::Cost)>;
// Required methods
fn is_end(&self, _: &Self::Node) -> bool;
fn heuristic(&self, _: &Self::Node) -> Self::Cost;
fn neighbors(&self, _: &Self::Node, _: &Self::Cost) -> Self::Iter;
// Provided method
fn estimate_length(&self) -> Option<u32> { ... }
}