adv_linalg_lib 0.1.1

Core library for Adv_LinAlg procedral macros
Documentation
mod no_std {
    #![cfg(feature = "no_std")]
    
    use core::ops::{Range, Index, IndexMut};
    use crate::vectors::{VectorSlice, MutVectorSlice};

    impl<'v, T> MutVectorSlice<'v, T> {
        pub fn len(&self) -> usize {
            self.values.len()
        }

        pub fn as_slice(&'v self, range: Range<usize>) -> VectorSlice<'v, T> {
            VectorSlice {
                values: self.values
                            .split_at(range.start).1
                            .split_at(range.len()).0
            }
        }
    }

    impl<'v, T> MutVectorSlice<'v, T> {
        pub fn lambda_mut<F>(&'v mut self, f: F) -> &'v mut Self
        where
            F: Fn(&mut T) {
            self.values.iter_mut().for_each(|value| f(value));
            self
        }

        pub fn lambda_index_mut<F>(&'v mut self, f: F) -> &'v mut Self
        where
            F: Fn(usize) {
            self.values.iter_mut().enumerate().for_each(|(index, _)| f(index));
            self
        }

        pub fn lambda_enumerate_mut<F>(&'v mut self, f: F) -> &'v mut Self
        where
            F: Fn(usize, &mut T) {
            self.values.iter_mut().enumerate().for_each(|(index, value)| f(index, value));
            self
        }
    }

    impl<'v, T, U> From<U> for MutVectorSlice<'v, T>
    where
        U: Into<&'v mut [T]>
    {
        fn from(values: U) -> Self {
            MutVectorSlice { values: values.into() }
        }
    }
    impl<'v, T> Index<usize> for MutVectorSlice<'v, T>
    where
        T: Clone {
        type Output = T;

        fn index(&self, index: usize) -> &Self::Output {
            &self.values[index]
        }
    }
    impl<'v, T> IndexMut<usize> for MutVectorSlice<'v, T>
    where
        T: Clone,
    {
        fn index_mut(&mut self, index: usize) -> &mut Self::Output {
            &mut self.values[index]
        }
    }
}

mod full {
    #![cfg(feature = "full")]

    use alloc::vec::Vec;
    use crate::vectors::{Vector, MutVectorSlice};

    impl<'v, T> MutVectorSlice<'v, T> {
        pub fn lambda<F>(&self, f: F) -> Vector<T>
        where
            F: Fn(&T) -> T {
            Vector::from(
                self.values
                    .iter()
                    .map(|value| f(value))
                    .collect::<Vec<T>>()
            )
        }

        pub fn lambda_index<F>(&self, f: F) -> Vector<T>
        where
            F: Fn(usize) -> T {
            Vector::from(
                self.values
                    .iter()
                    .enumerate()
                    .map(|(index, _)| f(index))
                    .collect::<Vec<T>>()
            )
        }

        pub fn lambda_enumerate<F>(&self, f: F) -> Vector<T>
        where
            F: Fn(usize, &T) -> T {
                Vector::from(
                    self.values
                        .iter()
                        .enumerate()
                        .map(|(index, value)| f(index, value))
                        .collect::<Vec<T>>()
                )
        }
    }
}