use fluent_result::into::IntoResult;
use crate::TryFromIterator;
use crate::errors::capacity::{FixedCap, RemainingCap};
use crate::errors::types::SizeHint;
use crate::errors::{CapacityError, CollectError};
use crate::impls::r#unsafe::IntoArrayError;
use super::PartialArray;
impl<const N: usize, T> RemainingCap for [T; N] {
fn remaining_cap(&self) -> SizeHint {
SizeHint::ZERO
}
}
impl<const N: usize, T> FixedCap for [T; N] {
const CAP: SizeHint = SizeHint::exact(N);
}
impl<const N: usize, T, I> TryFromIterator<I> for [T; N]
where
I: IntoIterator<Item = T>,
{
type Error = CollectError<I::IntoIter, PartialArray<T, N>, CapacityError<T>>;
fn try_from_iter(into_iter: I) -> Result<Self, Self::Error> {
let mut partial_array = PartialArray::new();
CollectError::ensure_fits_in::<Self>(into_iter.into_iter()).and_then(|mut iter| {
match iter.try_for_each(|item| partial_array.try_push(item).map(drop)) {
Err(item) => CollectError::collect_overflow::<[T; N]>(iter, partial_array, item).into_err(),
Ok(()) => partial_array
.try_into()
.map_err(|IntoArrayError { partial_array, error }| CollectError::new(iter, partial_array, error)),
}
})
}
}