cfg_if! {
if #[cfg(feature = "std")] {
use std::iter::FromIterator;
} else {
use core::iter::FromIterator;
}
}
use refs::{Ref, RefMut};
pub trait HasData {
type Item;
}
impl<T: IntoIterator> HasData for T {
type Item = <T as IntoIterator>::Item;
}
pub trait Iter<'a>: 'a + HasData {
type ItemRef: Ref<'a, Self::Item>;
type IterRef: Iterator<Item = Self::ItemRef>;
fn iter(&'a self) -> Self::IterRef;
}
impl<'a, T: 'a + HasData> Iter<'a> for T
where
&'a T: IntoIterator,
<&'a T as IntoIterator>::Item: Ref<'a, T::Item>,
{
type ItemRef = <&'a Self as IntoIterator>::Item;
type IterRef = <&'a Self as IntoIterator>::IntoIter;
fn iter(&'a self) -> Self::IterRef {
self.into_iter()
}
}
pub trait IterMut<'a>: Iter<'a> {
type ItemMut: RefMut<'a, Self::Item>;
type IterMut: Iterator<Item = Self::ItemMut>;
fn iter_mut(&'a mut self) -> Self::IterMut;
}
impl<'a, T: 'a + Iter<'a>> IterMut<'a> for T
where
&'a mut T: IntoIterator,
<&'a mut T as IntoIterator>::Item: RefMut<'a, T::Item>,
{
type ItemMut = <&'a mut Self as IntoIterator>::Item;
type IterMut = <&'a mut Self as IntoIterator>::IntoIter;
fn iter_mut(&'a mut self) -> Self::IterMut {
self.into_iter()
}
}
pub trait IterOwned
: HasData
+ IntoIterator<Item = <Self as HasData>::Item>
+ FromIterator<<Self as HasData>::Item>
+ Extend<<Self as HasData>::Item>
{}
impl<T> IterOwned for T
where
T: HasData,
T: IntoIterator<Item = <T as HasData>::Item>,
T: FromIterator<<T as HasData>::Item>,
T: Extend<<T as HasData>::Item>,
{}