use num_traits::FromPrimitive;
use crate::RhumbDistance;
use crate::{CoordFloat, Line, LineString, MultiLineString};
pub trait RhumbLength<T, RHS = Self> {
fn rhumb_length(&self) -> T;
}
impl<T> RhumbLength<T> for Line<T>
where
T: CoordFloat + FromPrimitive,
{
fn rhumb_length(&self) -> T {
let (start, end) = self.points();
start.rhumb_distance(&end)
}
}
impl<T> RhumbLength<T> for LineString<T>
where
T: CoordFloat + FromPrimitive,
{
fn rhumb_length(&self) -> T {
self.lines().fold(T::zero(), |total_length, line| {
total_length + line.rhumb_length()
})
}
}
impl<T> RhumbLength<T> for MultiLineString<T>
where
T: CoordFloat + FromPrimitive,
{
fn rhumb_length(&self) -> T {
self.0
.iter()
.fold(T::zero(), |total, line| total + line.rhumb_length())
}
}