rstsr-common 0.7.3

An n-Dimension Rust Tensor Toolkit
Documentation
use crate::prelude_dev::*;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AxesPairIndex<T> {
    None,
    Val(T),
    Pair(AxesIndex<T>, AxesIndex<T>),
}

impl<X1, X2, T> TryFrom<(X1, X2)> for AxesPairIndex<T>
where
    X1: TryInto<AxesIndex<T>, Error: Into<Error>>,
    X2: TryInto<AxesIndex<T>, Error: Into<Error>>,
{
    type Error = Error;

    fn try_from(value: (X1, X2)) -> Result<Self> {
        let axes_a = value.0.try_into().map_err(Into::into)?;
        let axes_b = value.1.try_into().map_err(Into::into)?;
        Ok(AxesPairIndex::Pair(axes_a, axes_b))
    }
}

#[duplicate_item(IType; [i32]; [isize]; [usize])]
#[allow(clippy::unnecessary_cast)]
impl From<IType> for AxesPairIndex<isize> {
    fn from(n: IType) -> Self {
        AxesPairIndex::Val(n as isize)
    }
}

impl<T> From<Option<T>> for AxesPairIndex<T> {
    fn from(opt: Option<T>) -> Self {
        match opt {
            Some(val) => AxesPairIndex::Val(val),
            None => AxesPairIndex::None,
        }
    }
}