use crate::drawing::backend::BackendCoord;
#[cfg(feature = "chrono")]
mod datetime;
mod logarithmic;
mod numeric;
mod ranged;
#[cfg(feature = "chrono")]
pub use datetime::{RangedDate, RangedDateTime};
pub use numeric::{
RangedCoordf32, RangedCoordf64, RangedCoordi32, RangedCoordi64, RangedCoordu32, RangedCoordu64,
};
pub use ranged::{AsRangedCoord, DescreteRanged, MeshLine, Ranged, RangedCoord, ReversableRanged};
pub use logarithmic::{LogCoord, LogRange, LogScalable};
pub trait CoordTranslate {
type From;
fn translate(&self, from: &Self::From) -> BackendCoord;
}
pub trait ReverseCoordTranslate: CoordTranslate {
fn reverse_translate(&self, input: BackendCoord) -> Option<Self::From>;
}
#[derive(Debug, Clone)]
pub struct Shift(pub BackendCoord);
impl CoordTranslate for Shift {
type From = BackendCoord;
fn translate(&self, from: &Self::From) -> BackendCoord {
(from.0 + (self.0).0, from.1 + (self.0).1)
}
}
impl ReverseCoordTranslate for Shift {
fn reverse_translate(&self, input: BackendCoord) -> Option<BackendCoord> {
Some((input.0 - (self.0).0, input.1 - (self.0).1))
}
}
pub struct ShiftAndTrans<T: CoordTranslate>(Shift, T);
impl<T: CoordTranslate> CoordTranslate for ShiftAndTrans<T> {
type From = T::From;
fn translate(&self, from: &Self::From) -> BackendCoord {
let temp = self.1.translate(from);
self.0.translate(&temp)
}
}
impl<T: ReverseCoordTranslate> ReverseCoordTranslate for ShiftAndTrans<T> {
fn reverse_translate(&self, input: BackendCoord) -> Option<T::From> {
Some(self.1.reverse_translate(self.0.reverse_translate(input)?)?)
}
}