use std::{fmt::Debug, ops::Sub};
use ndarray::{ArrayBase, ArrayViewMut, Data, Dimension, Ix1, RemoveAxis};
use num_traits::{Num, NumCast};
use crate::{BuilderError, InterpolateError};
use super::Interp2D;
mod bilinear;
pub use bilinear::Bilinear;
pub trait Interp2DStrategyBuilder<Sd, Sx, Sy, D>
where
Sd: Data,
Sd::Elem: Num + PartialOrd + NumCast + Copy + Debug + Sub + Send,
Sx: Data<Elem = Sd::Elem>,
Sy: Data<Elem = Sd::Elem>,
D: Dimension + RemoveAxis,
D::Smaller: RemoveAxis,
{
const MINIMUM_DATA_LENGHT: usize;
type FinishedStrat: Interp2DStrategy<Sd, Sx, Sy, D>;
fn build(
self,
x: &ArrayBase<Sx, Ix1>,
y: &ArrayBase<Sy, Ix1>,
data: &ArrayBase<Sd, D>,
) -> Result<Self::FinishedStrat, BuilderError>;
}
pub trait Interp2DStrategy<Sd, Sx, Sy, D>
where
Sd: Data,
Sd::Elem: Num + PartialOrd + NumCast + Copy + Debug + Sub + Send,
Sx: Data<Elem = Sd::Elem>,
Sy: Data<Elem = Sd::Elem>,
D: Dimension + RemoveAxis,
D::Smaller: RemoveAxis,
Self: Sized,
{
fn interp_into(
&self,
interpolator: &Interp2D<Sd, Sx, Sy, D, Self>,
target: ArrayViewMut<'_, Sd::Elem, <D::Smaller as Dimension>::Smaller>,
x: Sx::Elem,
y: Sy::Elem,
) -> Result<(), InterpolateError>;
}