nd_vector 0.1.0

[WIP] Lengthen! Shrink! Iterate! Scale! Twist and turn to your imagination along any dimension on a vector!
Documentation
use std::ops::{Index, IndexMut};

use crate::{usage_types::coordinates::Coordinate, VectorGrid};

impl<ItemType> Index<&Coordinate> for VectorGrid<ItemType> {
    type Output = ItemType;

    fn index(&self, index: &Coordinate) -> &Self::Output {
        &self.items[self.get_coordinate_index(index)]
    }
}

impl<ItemType> IndexMut<&Coordinate> for VectorGrid<ItemType> {
    fn index_mut(&mut self, index: &Coordinate) -> &mut Self::Output {
        let index = self.get_coordinate_index(index);
        &mut self.items[index]
    }
}

impl<ItemType> VectorGrid<ItemType> {
    pub fn get(&self, at: &Coordinate) -> Option<&ItemType> {
        if self.is_inside_grid(&at) {
            Some(&self.items[self.get_coordinate_index(&at)])
        } else {
            None
        }
        
    }

    pub fn get_mut(&mut self, at: &Coordinate) -> Option<&mut ItemType> {
        if self.is_inside_grid(&at) {
            let index = self.get_coordinate_index(&at);
            Some(&mut self.items[index])
        } else {
            None
        }
    }
}

impl<ItemType: Clone + Default> VectorGrid<ItemType> {
    pub fn get_or_default(&self, at: &Coordinate) -> ItemType {
        match self.get(at) {
            Some(some) => some.clone(),
            None => ItemType::default(),
        }
    }
}