1use std::borrow::Borrow;
2use std::hash::Hash;
3use std::ops::{Add};
4use crate::adjacency::AdjacencyGenerator;
5
6pub trait PositionKey: Copy + Clone + Add<Output = Self> + PartialOrd + Ord + Eq + Hash + num::Num + num::ToPrimitive + num::Zero + num::One + num::Bounded {}
7impl<P: Copy + Clone + Add<Output = P> + PartialOrd + Ord + Eq + Hash + num::Num + num::ToPrimitive + num::Zero + num::One + num::Bounded> PositionKey for P {}
9
10
11pub trait MapPosition<const DIMS: usize>: Eq + Hash + Sized + Copy + Clone + Borrow<Self> {
12 type Key: PositionKey;
13
14 fn get_dims(&self) -> [Self::Key; DIMS];
15 fn from_dims(dims: [Self::Key; DIMS]) -> Self;
16 fn adjacents<BS: Borrow<Self>, AG: AdjacencyGenerator<2, Input=BS>>(borrowed: BS) -> AG::Output;
17}
18
19pub trait ConvertibleMapPosition<const DIMS: usize, T>: MapPosition<DIMS> {
20 type ConvertsTo: MapPosition<DIMS, Key=T>;
21
22 fn convert(self) -> Self::ConvertsTo;
23}