use geo_types::Coord;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct TileId {
pub x: i32,
pub y: i32,
}
impl TileId {
#[must_use]
pub fn new(x: i32, y: i32) -> Self {
Self { x, y }
}
#[must_use]
pub fn origin(self, extent: u32) -> Option<Coord<i32>> {
let e = i64::from(extent);
Some(Coord {
x: i32::try_from(i64::from(self.x) * e).ok()?,
y: i32::try_from(i64::from(self.y) * e).ok()?,
})
}
}
impl From<(i32, i32)> for TileId {
fn from((x, y): (i32, i32)) -> Self {
Self { x, y }
}
}
pub(crate) fn tile_of(c: Coord<i32>, extent: i32) -> TileId {
TileId::new(c.x.div_euclid(extent), c.y.div_euclid(extent))
}