amazeing 0.8.1

Amazeing is a maze generator/solver application with simulation/visualization.
use crate::maze::Node;
use crate::render::helper::{current_millis, handle_mouse_click, solve_maze, take_a_snap};
use crate::render::scene::MazeScene;
use macroquad::prelude::*;

pub(crate) async fn solve_loop(scene: &mut MazeScene) {
    let sources = &mut vec![];
    let mut destination: Option<Node> = None;
    let mut path: Vec<Node> = vec![];

    loop {
        let current_frame_start_time = current_millis();

        scene.clear_and_draw();

        if is_mouse_button_pressed(MouseButton::Left) {
            handle_mouse_click(scene, sources, &mut destination, mouse_position());

            if !sources.is_empty()
                && let Some(destination) = destination
            {
                path.iter().for_each(|node| {
                    if sources.first().unwrap().ne(node) && destination.ne(node) {
                        scene.display_open(*node)
                    }
                });

                path = solve_maze(
                    &scene.maze,
                    *sources.first().unwrap(),
                    destination,
                    &scene.context.procedure,
                    scene.context.heuristic,
                    &mut None,
                );

                path.iter().for_each(|node| {
                    if sources.first().unwrap().ne(node) && destination.ne(node) {
                        scene.display_path(*node)
                    }
                })
            }
        }

        take_a_snap(scene);

        if is_key_pressed(KeyCode::Q) {
            break;
        }

        scene.delay_till_next_frame(current_frame_start_time);

        next_frame().await
    }
}