linearize 0.1.6

Types that are enumerable and an array-backed map
Documentation
use {
    crate::{static_map, Linearize, StaticCopyMap, StaticMap},
    arbitrary_1::{size_hint, Arbitrary, MaxRecursionReached, Unstructured},
};

impl<'a, L, T> Arbitrary<'a> for StaticMap<L, T>
where
    L: Linearize,
    T: Arbitrary<'a>,
{
    fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary_1::Result<Self> {
        Ok(static_map! {
            _ => T::arbitrary(u)?,
        })
    }

    fn size_hint(depth: usize) -> (usize, Option<usize>) {
        Self::try_size_hint(depth).unwrap_or_default()
    }

    fn try_size_hint(
        depth: usize,
    ) -> arbitrary_1::Result<(usize, Option<usize>), MaxRecursionReached> {
        size_hint::try_recursion_guard(depth, |depth| {
            let (lo, hi) = T::try_size_hint(depth)?;
            Ok((
                lo.saturating_mul(L::LENGTH),
                hi.and_then(|hi| hi.checked_mul(L::LENGTH)),
            ))
        })
    }
}

impl<'a, L, T> Arbitrary<'a> for StaticCopyMap<L, T>
where
    L: Linearize,
    T: Arbitrary<'a> + Copy,
{
    fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary_1::Result<Self> {
        StaticMap::arbitrary(u).map(|v| v.into_copy())
    }

    fn size_hint(depth: usize) -> (usize, Option<usize>) {
        StaticMap::<L, T>::size_hint(depth)
    }

    fn try_size_hint(
        depth: usize,
    ) -> arbitrary_1::Result<(usize, Option<usize>), MaxRecursionReached> {
        StaticMap::<L, T>::try_size_hint(depth)
    }
}