pub mod algos;
pub mod implementations;
use core::cmp::Ordering;
use core::fmt::Debug;
pub type Me = MedError<String>;
#[derive(Debug)]
pub enum MedError<T> {
Size(T),
Nan(T),
Other(T),
}
pub fn merror<T>(kind: &str, msg: impl Into<String>) -> Result<T,MedError<String>> {
match kind {
"size" => Err(MedError::Size(msg.into())),
"nan" => Err(MedError::Nan(msg.into())),
"other" => Err(MedError::Other(msg.into())),
_ => Err(MedError::Other("Wrong error kind given to merror".into()))
}
}
pub enum Medians<'a, T> {
Odd(&'a T),
Even((&'a T, &'a T)),
}
pub trait Medianf64 {
fn medf_checked(self) -> Result<f64, Me>;
fn medf_unchecked(self) -> f64;
fn medf_weighted(self, ws: Self, eps: f64) -> Result<f64, Me>;
fn medf_zeroed(self, centre: f64) -> Vec<f64>;
fn medf_correlation(self, v: Self) -> Result<f64, Me>;
fn madf(self, centre: f64) -> f64;
}
pub trait Median<'a, T> {
fn qmedian_by(
self,
c: &mut impl FnMut(&T, &T) -> Ordering,
q: impl Fn(&T) -> f64,
) -> Result<f64, Me>;
fn median_by(self, c: &mut impl FnMut(&T, &T) -> Ordering) -> Result<Medians<'a, T>, Me>;
fn zeroed(self, centre: f64, quantify: impl Fn(&T) -> f64) -> Result<Vec<f64>, Me>;
fn med_correlation(
self,
v: Self,
c: &mut impl FnMut(&T, &T) -> Ordering,
q: impl Fn(&T) -> f64,
) -> Result<f64, Me>;
fn mad(self, centre: f64, quantify: impl Fn(&T) -> f64) -> f64;
}