use std::iter::{Iterator, Skip};
use std::slice::Iter;
pub struct Tails<'a, T: 'a> {
iter: &'a T,
index: usize,
last: bool,
}
impl<'a, T: 'a> Tails<'a, T> {
pub fn create(iter: &'a T) -> Self {
Tails {
iter,
index: 0,
last: false,
}
}
}
impl<'a, T> Iterator for Tails<'a, Vec<T>> {
type Item = &'a[T];
fn next(&mut self) -> Option<Self::Item> {
if self.last {
None
} else {
let res = &self.iter[self.index..];
self.last = res.len() == 0;
self.index += 1;
Some(res)
}
}
}
impl<'a, T> Iterator for Tails<'a, Iter<'a, T>> {
type Item = Skip<Iter<'a,T>>;
fn next(&mut self) -> Option<Self::Item> {
if self.last {
None
} else {
let tmp = self.iter.clone();
let res = tmp.skip(self.index);
self.last = res.peekable().peek().is_none();
let tmp = self.iter.clone();
let res = tmp.skip(self.index);
self.index += 1;
Some(res)
}
}
}
impl<'a, T> Iterator for Tails<'a, &'a[T]> {
type Item = &'a[T];
fn next(&mut self) -> Option<Self::Item> {
if self.last {
None
} else {
let res = &self.iter[self.index..];
self.last = res.len() == 0;
self.index += 1;
Some(res)
}
}
}