importgleam/floatimportgleam/intimportgleam/listimportvec/vec2importvec/vec2i.{typeVec2i}constsqrt2minus1=0.41421356237309515/// The [Euclidean heuristic](https://wikipedia.org/wiki/Euclidean_distance).
///
pubfnheuristic_euclidean(a:Vec2i,b:Vec2i)->Float{vec2i.distance(a,b)}/// The [Manhattan heuristic](https://wikipedia.org/wiki/Taxicab_geometry).
///
/// Note that this heuristic is intended to be used with 4-side orthogonal
/// movements.
///
pubfnheuristic_manhattan(a:Vec2i,b:Vec2i)->Float{vec2i.subtract(a,b)|>vec2i.absolute_value|>vec2.to_list|>int.sum|>int.to_float}/// The Octile heuristic.
///
pubfnheuristic_octile(a:Vec2i,b:Vec2i)->Float{letassert[shortest,..rest]=vec2i.subtract(a,b)|>vec2i.absolute_value|>vec2i.to_vec2f|>vec2.to_list|>list.sort(float.compare)[shortest*.sqrt2minus1,..rest]|>float.sum}/// The [Chebyshev heuristic](https://wikipedia.org/wiki/Chebyshev_distance).
///
pubfnheuristic_chebyshev(a:Vec2i,b:Vec2i)->Float{letassertOk(score)=vec2i.subtract(a,b)|>vec2i.absolute_value|>vec2.to_list|>list.max(int.compare)score|>int.to_float}
```gleam
import gleam/float
import gleam/int
import gleam/list
import vec/vec2
import vec/vec2i.{type Vec2i}
const sqrt2minus1 = 0.41421356237309515
/// The [Euclidean heuristic](https://wikipedia.org/wiki/Euclidean_distance).
///
pub fn heuristic_euclidean(a: Vec2i, b: Vec2i) -> Float {
vec2i.distance(a, b)
}
/// The [Manhattan heuristic](https://wikipedia.org/wiki/Taxicab_geometry).
///
/// Note that this heuristic is intended to be used with 4-side orthogonal
/// movements.
///
pub fn heuristic_manhattan(a: Vec2i, b: Vec2i) -> Float {
vec2i.subtract(a, b)
|> vec2i.absolute_value
|> vec2.to_list
|> int.sum
|> int.to_float
}
/// The Octile heuristic.
///
pub fn heuristic_octile(a: Vec2i, b: Vec2i) -> Float {
let assert [shortest, ..rest] =
vec2i.subtract(a, b)
|> vec2i.absolute_value
|> vec2i.to_vec2f
|> vec2.to_list
|> list.sort(float.compare)
[shortest *. sqrt2minus1, ..rest] |> float.sum
}
/// The [Chebyshev heuristic](https://wikipedia.org/wiki/Chebyshev_distance).
///
pub fn heuristic_chebyshev(a: Vec2i, b: Vec2i) -> Float {
let assert Ok(score) =
vec2i.subtract(a, b)
|> vec2i.absolute_value
|> vec2.to_list
|> list.max(int.compare)
score |> int.to_float
}
```