use std::num::{NonZeroU64, NonZeroUsize};
use zarrs_metadata::ArrayShape;
mod sealed {
pub trait Sealed {}
}
impl<T> sealed::Sealed for T where T: AsRef<[NonZeroU64]> {}
pub trait ChunkShapeTraits: AsRef<[NonZeroU64]> + sealed::Sealed {
#[must_use]
fn to_array_shape(&self) -> ArrayShape {
self.as_ref().iter().map(|i| i.get()).collect()
}
#[must_use]
fn num_elements(&self) -> NonZeroU64 {
unsafe {
NonZeroU64::new_unchecked(self.num_elements_u64())
}
}
#[must_use]
fn num_elements_nonzero_usize(&self) -> NonZeroUsize {
unsafe {
NonZeroUsize::new_unchecked(usize::try_from(self.num_elements_u64()).unwrap())
}
}
#[must_use]
fn num_elements_u64(&self) -> u64 {
self.as_ref()
.iter()
.copied()
.map(NonZeroU64::get)
.product::<u64>()
}
#[must_use]
fn num_elements_usize(&self) -> usize {
usize::try_from(self.num_elements_u64()).unwrap()
}
}
impl<T> ChunkShapeTraits for T where T: AsRef<[NonZeroU64]> {}