use super::{NamespaceComponentsHint, NamespacePath, RawNamespacePath};
impl<T: NamespacePath> NamespacePath for Option<T> {
#[inline]
fn components(&self) -> impl IntoIterator<Item = crate::NamespaceComponent<'_>> {
self.as_ref().into_iter().flat_map(T::components)
}
#[inline]
fn components_hint(&self) -> NamespaceComponentsHint {
self.as_ref()
.map(T::components_hint)
.unwrap_or_else(NamespaceComponentsHint::empty)
}
}
impl<T: RawNamespacePath> RawNamespacePath for Option<T> {
#[inline]
fn raw_components(&self) -> impl IntoIterator<Item = impl core::fmt::Display> {
self.as_ref().into_iter().flat_map(T::raw_components)
}
}
impl<L: NamespacePath, R: NamespacePath> NamespacePath for either::Either<L, R> {
#[inline]
fn components(&self) -> impl IntoIterator<Item = crate::NamespaceComponent<'_>> {
match self {
either::Either::Left(v) => either::Left(v.components().into_iter()),
either::Either::Right(v) => either::Right(v.components().into_iter()),
}
}
#[inline]
fn components_hint(&self) -> NamespaceComponentsHint {
either::for_both!(self, s => s.components_hint())
}
}
impl<L: RawNamespacePath, R: RawNamespacePath> RawNamespacePath for either::Either<L, R> {
#[inline]
fn raw_components(&self) -> impl IntoIterator<Item = impl core::fmt::Display> {
match self {
either::Either::Left(l) => {
either::Left(l.raw_components().into_iter().map(either::Left))
}
either::Either::Right(r) => {
either::Right(r.raw_components().into_iter().map(either::Right))
}
}
}
}
impl<T: NamespacePath> NamespacePath for [T] {
#[inline]
fn components(&self) -> impl IntoIterator<Item = crate::NamespaceComponent<'_>> {
self.iter().flat_map(NamespacePath::components)
}
#[inline]
fn components_hint(&self) -> super::NamespaceComponentsHint {
self.iter()
.map(NamespacePath::components_hint)
.fold(NamespaceComponentsHint::empty(), |prev, add| {
prev.with_appended(add)
})
}
}
impl<T: RawNamespacePath> RawNamespacePath for [T] {
#[inline]
fn raw_components(&self) -> impl IntoIterator<Item = impl core::fmt::Display> {
self.iter().flat_map(RawNamespacePath::raw_components)
}
}
impl<T: NamespacePath, const N: usize> NamespacePath for [T; N] {
#[inline(always)]
fn components(&self) -> impl IntoIterator<Item = crate::NamespaceComponent<'_>> {
self.as_slice().components()
}
#[inline(always)]
fn components_hint(&self) -> NamespaceComponentsHint {
self.as_slice().components_hint()
}
}
impl<T: RawNamespacePath, const N: usize> RawNamespacePath for [T; N] {
#[inline(always)]
fn raw_components(&self) -> impl IntoIterator<Item = impl core::fmt::Display> {
self.as_slice().raw_components()
}
}
#[cfg(any(feature = "alloc", test))]
impl<T: NamespacePath> NamespacePath for alloc::vec::Vec<T> {
#[inline]
fn components(&self) -> impl IntoIterator<Item = crate::NamespaceComponent<'_>> {
self.as_slice().components()
}
#[inline]
fn components_hint(&self) -> NamespaceComponentsHint {
self.as_slice().components_hint()
}
}
#[cfg(any(feature = "alloc", test))]
impl<T: RawNamespacePath> RawNamespacePath for alloc::vec::Vec<T> {
#[inline]
fn raw_components(&self) -> impl IntoIterator<Item = impl core::fmt::Display> {
self.as_slice().raw_components()
}
}