use std::sync::mpsc;
use std::thread;
use std::vec;
use rusty_planner::dstar_lite;
use rusty_planner::planner;
struct Graph {
moves: i32,
}
impl planner::ProblemSpace for Graph {
type State = i32;
type Iter = vec::IntoIter<(Self::State, f64)>;
fn heuristic(&self, _: &Self::State, _: &Self::State) -> f64 {
0.0
}
fn succ(&self, state: &Self::State) -> Self::Iter {
match (*state, self.moves) {
(0, _) => vec![(1, 1.0)].into_iter(),
(1, _) => vec![(2, 1.0), (3, 5.0)].into_iter(),
(2, 0) => vec![(4, 1.0)].into_iter(),
(2, _) => vec![(4, 10.0)].into_iter(),
(3, _) => vec![(4, 2.0)].into_iter(),
_ => vec![].into_iter(),
}
}
fn pred(&self, state: &Self::State) -> Self::Iter {
match (*state, self.moves) {
(1, _) => vec![(0, 1.0)].into_iter(),
(2, _) => vec![(1, 1.0)].into_iter(),
(3, _) => vec![(1, 2.0)].into_iter(),
(4, 0) => vec![(2, 1.0), (3, 5.0)].into_iter(),
(4, _) => vec![(2, 10.0), (3, 5.0)].into_iter(),
_ => vec![].into_iter(),
}
}
}
impl planner::Lifelong for Graph {
fn update(&mut self, _: &Self::State) {
self.moves += 1;
}
}
fn callback(path: Vec<i32>) {
print!("start");
for x in &path {
print!(" -> {}", x);
}
print!("\n");
}
fn main() {
let (tx, rx) = mpsc::channel();
let mut graph = Graph { moves: 0 };
let plnr = thread::spawn(move || {
dstar_lite::solve(&mut graph, 0, 4, rx, callback);
});
tx.send((2, 1)).unwrap();
tx.send((-1, 4)).unwrap();
plnr.join().unwrap();
}