object-rainbow 0.0.0-a.67

distributed object model
Documentation
use std::ops::Mul;

use typenum::ToUInt;

use crate::{
    sequence::{PlainCollection, VecLike},
    *,
};

impl<T: InlineOutput, const N: usize> ToOutput for [T; N] {
    fn to_output(&self, output: &mut impl Output) {
        T::slice_to_output(self, output);
    }
}

impl<T: InlineOutput, const N: usize> InlineOutput for [T; N] {}

impl<T: ListHashes, const N: usize> ListHashes for [T; N] {
    fn list_hashes(&self, f: &mut impl FnMut(Hash)) {
        self.iter_list_hashes(f);
    }
}

impl<T: Topological, const N: usize> Topological for [T; N] {
    fn traverse(&self, visitor: &mut impl PointVisitor) {
        self.iter_traverse(visitor);
    }
}

impl<T: Tagged, const N: usize> Tagged for [T; N] {
    const TAGS: Tags = T::TAGS;
}

impl<T: Size, const N: usize> Size for [T; N]
where
    typenum::generic_const_mappings::Const<N>:
        ToUInt<Output: Unsigned + Mul<T::Size, Output: Unsigned>>,
{
    const SIZE: usize = T::SIZE * N;
    type Size =
        <<typenum::generic_const_mappings::Const<N> as ToUInt>::Output as Mul<T::Size>>::Output;
}

impl<T: ParseInline<I>, const N: usize, I: ParseInput> Parse<I> for [T; N] {
    fn parse(input: I) -> crate::Result<Self> {
        ParseInline::parse_as_inline(input)
    }
}

impl<T: ParseInline<I>, const N: usize, I: ParseInput> ParseInline<I> for [T; N] {
    fn parse_inline(input: &mut I) -> crate::Result<Self> {
        input.parse_array()
    }
}

impl<T: ByteOrd + InlineOutput, const N: usize> ByteOrd for [T; N] {
    fn bytes_cmp(&self, other: &Self) -> Ordering {
        self.iter_bytes_cmp(other)
    }
}

impl<T, const N: usize> MaybeHasNiche for [T; N]
where
    typenum::generic_const_mappings::Const<N>: ToUInt<Output: ArrayLength>,
    GenericArray<T, <typenum::generic_const_mappings::Const<N> as ToUInt>::Output>: MaybeHasNiche,
{
    type MnArray =
        <GenericArray<T, <typenum::generic_const_mappings::Const<N> as ToUInt>::Output> as MaybeHasNiche>::MnArray;
}

#[test]
fn byte_array_niche() {
    assert_eq!(
        None::<(GenericArray<u8, typenum::U2>, bool)>.vec(),
        [0, 0, 2],
    );
    assert_eq!(None::<([u8; 2], bool)>.vec(), [0, 0, 2]);
}

impl<T, const N: usize> PlainCollection for [T; N] {}
impl<T, const N: usize> VecLike for [T; N] {}