use alloc::vec::Vec;
use geo_types::{CoordNum, Polygon};
use geometry_coords::CoordinateScalar;
use geometry_tag::PolygonTag;
use geometry_trait::{Geometry, Polygon as PolygonTrait};
use crate::geo_coord::GeoCoord;
use crate::geo_ring::GeoRing;
#[derive(Debug, Clone, PartialEq)]
pub struct GeoPolygon<T: CoordNum> {
exterior: GeoRing<T>,
interiors: Vec<GeoRing<T>>,
}
impl<T: CoordNum> GeoPolygon<T> {
#[inline]
#[must_use]
pub fn new(inner: Polygon<T>) -> Self {
let (exterior, interiors) = inner.into_inner();
Self {
exterior: GeoRing::new(exterior),
interiors: interiors.into_iter().map(GeoRing::new).collect(),
}
}
#[inline]
#[must_use]
pub fn into_inner(self) -> Polygon<T> {
Polygon::new(
self.exterior.into_inner(),
self.interiors
.into_iter()
.map(GeoRing::into_inner)
.collect(),
)
}
}
impl<T: CoordinateScalar + CoordNum> Geometry for GeoPolygon<T> {
type Kind = PolygonTag;
type Point = GeoCoord<T>;
}
impl<T: CoordinateScalar + CoordNum> PolygonTrait for GeoPolygon<T> {
type Ring = GeoRing<T>;
fn exterior(&self) -> &GeoRing<T> {
&self.exterior
}
fn interiors(&self) -> impl ExactSizeIterator<Item = &GeoRing<T>> {
self.interiors.iter()
}
}