mod bininterval;
pub use bininterval::bininterval::BinInterval;
pub use bininterval::singlevaluebininterval::SingleValueBinInterval;
mod uniformcyclic;
pub use uniformcyclic::UniformCyclic;
mod variablecyclic;
pub use variablecyclic::VariableCyclic;
mod uniform;
pub use uniform::Uniform;
mod uniformnoflow;
pub use uniformnoflow::UniformNoFlow;
mod category;
pub use category::Category;
mod categorynoflow;
pub use categorynoflow::CategoryNoFlow;
mod variable;
pub use variable::Variable;
mod variablenoflow;
pub use variablenoflow::VariableNoFlow;
type Iter<'a, BinInterval> = Box<dyn Iterator<Item = (usize, BinInterval)> + 'a>;
type Indices = Box<dyn Iterator<Item = usize>>;
type Bins<'a, BinInterval> = Box<dyn Iterator<Item = BinInterval> + 'a>;
pub trait Axis {
type Coordinate;
type BinInterval;
fn index(&self, coordinate: &Self::Coordinate) -> Option<usize>;
fn num_bins(&self) -> usize;
fn bin(&self, index: usize) -> Option<Self::BinInterval>;
fn indices(&self) -> Indices {
Box::new(0..self.num_bins())
}
fn iter(&self) -> Iter<'_, Self::BinInterval> {
Box::new(self.indices().map(move |it| {
(
it,
self.bin(it)
.expect("indices() should only produce valid indices"),
)
}))
}
fn bins(&self) -> Bins<'_, Self::BinInterval> {
Box::new(self.indices().map(move |it| {
self.bin(it)
.expect("indices() should only produce valid indices")
}))
}
fn num_dim(&self) -> usize {
1
}
}