cido 0.2.0

Core traits and implementations for indexing with cido
Documentation
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use serde_with::serde_as;

#[serde_as]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[repr(transparent)]
#[serde(transparent)]
pub struct FixedArray<T: Serialize + DeserializeOwned, const N: usize> {
  #[serde_as(as = "[_; N]")]
  data: [T; N],
}

impl<T, const N: usize> IntoIterator for FixedArray<T, N>
where
  T: Serialize + DeserializeOwned,
{
  type Item = T;
  type IntoIter = core::array::IntoIter<T, N>;

  fn into_iter(self) -> Self::IntoIter {
    self.data.into_iter()
  }
}

impl<T, const N: usize> From<[T; N]> for FixedArray<T, N>
where
  T: Serialize + DeserializeOwned,
{
  fn from(data: [T; N]) -> Self {
    Self { data }
  }
}

impl<T, const N: usize> From<FixedArray<T, N>> for [T; N]
where
  T: Serialize + DeserializeOwned,
{
  fn from(data: FixedArray<T, N>) -> Self {
    data.data
  }
}

impl<T, const N: usize> AsRef<[T]> for FixedArray<T, N>
where
  T: Serialize + DeserializeOwned,
{
  fn as_ref(&self) -> &[T] {
    &self.data
  }
}

impl<T, const N: usize> AsMut<[T]> for FixedArray<T, N>
where
  T: Serialize + DeserializeOwned,
{
  fn as_mut(&mut self) -> &mut [T] {
    &mut self.data
  }
}

impl<T, const N: usize> FixedArray<T, N>
where
  T: Serialize + DeserializeOwned,
{
  pub fn new(data: [T; N]) -> Self {
    Self { data }
  }
}