use crate::{
transformations::{
ChainedCol, FilteredCol, FlattenedCol, FusedCol, ReversedCol, SkippedCol, SkippedWhileCol,
SteppedByCol, TakenCol, TakenWhileCol,
},
Iterable,
};
pub trait Collection {
type Item;
type Iterable<'i>: Iterable<Item = &'i Self::Item>
where
Self: 'i;
fn iter(&self) -> <Self::Iterable<'_> as Iterable>::Iter {
self.as_iterable().iter()
}
fn as_iterable(&self) -> Self::Iterable<'_>;
fn into_chained<I>(self, other: I) -> ChainedCol<Self, I, Self, I>
where
Self: Sized,
I: Collection<Item = Self::Item>,
{
ChainedCol {
it1: self,
it2: other,
phantom: Default::default(),
}
}
fn into_filtered<P>(self, filter: P) -> FilteredCol<Self, Self, P>
where
Self: Sized,
P: Fn(&Self::Item) -> bool + Copy,
{
FilteredCol {
it: self,
filter,
phantom: Default::default(),
}
}
fn into_flattened(self) -> FlattenedCol<Self, Self>
where
Self: Sized,
Self::Item: IntoIterator,
for<'i> &'i Self::Item: IntoIterator<Item = &'i <Self::Item as IntoIterator>::Item>,
{
FlattenedCol {
it: self,
phantom: Default::default(),
}
}
fn into_fused(self) -> FusedCol<Self, Self>
where
Self: Sized,
{
FusedCol {
it: self,
phantom: Default::default(),
}
}
fn into_reversed(self) -> ReversedCol<Self, Self>
where
Self: Sized,
for<'b> <Self::Iterable<'b> as Iterable>::Iter: DoubleEndedIterator,
{
ReversedCol {
it: self,
phantom: Default::default(),
}
}
fn into_skipped(self, n: usize) -> SkippedCol<Self, Self>
where
Self: Sized,
{
SkippedCol {
it: self,
n,
phantom: Default::default(),
}
}
fn into_skipped_while<P>(self, skip_while: P) -> SkippedWhileCol<Self, Self, P>
where
Self: Sized,
P: Fn(&Self::Item) -> bool + Copy,
{
SkippedWhileCol {
it: self,
skip_while,
phantom: Default::default(),
}
}
fn into_stepped_by(self, step: usize) -> SteppedByCol<Self, Self>
where
Self: Sized,
{
SteppedByCol {
it: self,
step,
phantom: Default::default(),
}
}
fn into_taken(self, n: usize) -> TakenCol<Self, Self>
where
Self: Sized,
{
TakenCol {
it: self,
n,
phantom: Default::default(),
}
}
fn into_taken_while<P>(self, take_while: P) -> TakenWhileCol<Self, Self, P>
where
Self: Sized,
P: Fn(&Self::Item) -> bool + Copy,
{
TakenWhileCol {
it: self,
take_while,
phantom: Default::default(),
}
}
}
impl<X> Collection for X
where
X: IntoIterator,
for<'a> &'a X: IntoIterator<Item = &'a <X as IntoIterator>::Item>,
{
type Item = <X as IntoIterator>::Item;
type Iterable<'i>
= &'i X
where
Self: 'i;
fn iter(&self) -> <Self::Iterable<'_> as Iterable>::Iter {
<&X as IntoIterator>::into_iter(self)
}
fn as_iterable(&self) -> Self::Iterable<'_> {
self
}
}