use crate::core::unfold::unfold;
pub trait List<Item> {
#[must_use]
fn first(&self) -> Option<&Item>;
#[must_use]
fn last(&self) -> Option<&Item>;
#[must_use]
fn repeat(self, n: usize) -> Self
where
Item: Clone;
}
pub(crate) fn repeat<'a, Item: Clone + 'a, Collection: FromIterator<Item>>(
iterator: impl Iterator<Item = &'a Item>, n: usize,
) -> Collection {
let collection = iterator.collect::<Vec<&Item>>();
let mut values = collection.iter().cycle();
let mut remaining = collection.len() * n;
unfold(|| {
if remaining == 0 {
return None;
}
let new_item = values.next().map(|&x| x.clone());
remaining -= 1;
new_item
})
.collect()
}