fn find_shortest_path<F, GP, HP>(
    grid: &Grid,
    start: (usize, usize),
    height_difference_predicate: HP,
    goal_met_predicate: GP,
    cost_function: F
) -> Option<usize>where
    HP: Fn(u8, u8) -> bool,
    GP: Fn((usize, usize), u8) -> bool,
    F: Fn((usize, usize), usize, u8) -> usize,