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 }
}
}