factorio_blueprint/factorio-pathfinding/src/graph/wheighted_graph/mod.rs

49 lines
1 KiB
Rust

pub mod adjacency_list;
pub mod shortest_path;
pub trait WheightedGraph: Sized {
type Node;
fn num_edges(&self, node: &Self::Node) -> usize {
self.edge_iter(node).count()
}
fn edge(&self, node: &Self::Node, num: usize) -> Option<(Self::Node, f64)>;
fn edge_iter<'a, 'b>(&'a self, node: &'b Self::Node) -> WheightedGraphEdgeIter<'a, 'b, Self> {
WheightedGraphEdgeIter::new(self, node)
}
}
pub struct WheightedGraphEdgeIter<'a, 'b, G>
where
G: WheightedGraph,
{
graph: &'a G,
node: &'b G::Node,
count: usize,
}
impl<'a, 'b, G> WheightedGraphEdgeIter<'a, 'b, G>
where
G: WheightedGraph,
{
pub fn new(graph: &'a G, node: &'b G::Node) -> Self {
Self {
graph,
node,
count: 0,
}
}
}
impl<'a, 'b, G> Iterator for WheightedGraphEdgeIter<'a, 'b, G>
where
G: WheightedGraph,
{
type Item = (G::Node, f64);
fn next(&mut self) -> Option<Self::Item> {
self.count += 1;
self.graph.edge(self.node, self.count - 1)
}
}