Basic route finder

pull/25/head
Wilfred Hughes 2021-06-27 17:21:27 +07:00
parent 1f4c7af8fb
commit 1669405e43
1 changed files with 35 additions and 0 deletions

@ -1,6 +1,8 @@
#![allow(dead_code)]
use std::cmp::Ordering;
use std::collections::BinaryHeap;
use std::collections::HashSet;
use std::hash::{Hash, Hasher};
use crate::tree_diff::Node;
@ -67,6 +69,13 @@ impl<'a> PartialEq for EqualityGraphNode<'a> {
}
impl<'a> Eq for EqualityGraphNode<'a> {}
impl<'a> Hash for EqualityGraphNode<'a> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.gn.lhs_next_node().hash(state);
self.gn.rhs_next_node().hash(state);
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
enum Action {
UnchangedNode,
@ -93,6 +102,32 @@ impl Action {
}
}
fn find_route<'a>(start: GraphNode<'a>) {
let mut heap = BinaryHeap::new();
heap.push(OrderedGraphNode { gn: start });
let mut visited: HashSet<EqualityGraphNode> = HashSet::new();
loop {
match heap.pop() {
Some(ogn) => {
let egn = EqualityGraphNode { gn: ogn.gn };
if visited.contains(&egn) {
continue;
}
let gn = egn.gn;
for new_gn in next_graph_nodes(&gn) {
heap.push(OrderedGraphNode { gn: new_gn });
}
visited.insert(EqualityGraphNode { gn });
}
None => break,
}
}
}
fn next_graph_nodes<'a>(gn: &GraphNode<'a>) -> Vec<GraphNode<'a>> {
let mut res = vec![];