///|
fn main {
  let grid = @moonpath.Grid::from_blocked(6, 4, [
    @moonpath.Point::{ x: 2, y: 0 },
    @moonpath.Point::{ x: 2, y: 1 },
    @moonpath.Point::{ x: 2, y: 2 },
  ])
  grid.set_cost(@moonpath.Point::new(3, 3), 4)
  let start = @moonpath.Point::{ x: 0, y: 0 }
  let goal = @moonpath.Point::{ x: 5, y: 0 }
  let graph = grid.to_graph4()
  let components = graph.weakly_connected_components().length()
  match grid.astar4(start, goal) {
    Some(path) =>
      println(
        "moonpath demo: cost=\{path.cost}, steps=\{path.nodes.length() - 1}, visited=\{path.visited}, open=\{grid.open_points().length()}, components=\{components}",
      )
    None => println("moonpath demo: no path")
  }
}