use std::iter::Cloned;
use std::slice::Iter;
use std::str::Chars;
pub trait Len {
fn len(&self) -> usize;
}
pub trait Seq:
for<'a> FromIterator<<Self::Iterator<'a> as Iterator>::Item> + Len + 'static
{
type Iterator<'a>: Iterator
where
Self: 'a;
fn iter(&self) -> Self::Iterator<'_>;
}
impl Len for String {
fn len(&self) -> usize {
self.chars().count()
}
}
impl Seq for String {
type Iterator<'a> = Chars<'a>;
fn iter(&self) -> Self::Iterator<'_> {
self.chars()
}
}
impl<T> Len for Vec<T> {
fn len(&self) -> usize {
Vec::len(self)
}
}
impl<T> Seq for Vec<T>
where
T: Clone + 'static,
{
type Iterator<'a> = Cloned<Iter<'a, T>>;
fn iter(&self) -> Self::Iterator<'_> {
<[T]>::iter(self).cloned()
}
}