use std::marker::PhantomData;
use geo::CoordFloat;
use geo_types::Coord;
use crate::Transform;
#[derive(Clone, Copy, Debug)]
pub struct Compose<T, TA, TB> {
p_t: PhantomData<T>,
pub a: TA,
pub b: TB,
}
impl<T, TA, TB> Compose<T, TA, TB> {
#[inline]
pub const fn new(a: TA, b: TB) -> Self {
Self {
p_t: PhantomData::<T>,
a,
b,
}
}
}
impl<T, TA, TB> Transform for Compose<T, TA, TB>
where
TA: Transform<T = T>,
TB: Transform<T = T>,
T: CoordFloat,
{
type T = T;
fn transform(&self, coordinate: &Coord<T>) -> Coord<T> {
let temp = self.a.transform(coordinate);
self.b.transform(&temp)
}
fn invert(&self, coordinate: &Coord<T>) -> Coord<T> {
let temp = self.b.invert(coordinate);
self.a.invert(&temp)
}
}