pub trait Fill<T> {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=T>;
fn fill_and_keep_tail<I>(&mut self, iter: I) -> I::IntoIter
where I: IntoIterator<Item=T>
{
let mut iter = iter.into_iter();
self.fill(&mut iter);
iter
}
fn fill_count<I>(&mut self, iter: I) -> usize
where I: IntoIterator<Item=T>
{
let mut count = 0;
self.fill(iter.into_iter().inspect(|_| count += 1));
count
}
fn checked_fill<I>(&mut self, iter: I) -> Option<I::IntoIter>
where I: IntoIterator<Item=T>
{
struct Overflow<I> {
overflow: bool,
inner: I,
}
impl<I: Iterator> Iterator for Overflow<I> {
type Item = I::Item;
fn next(&mut self) -> Option<I::Item> {
let next = self.inner.next();
self.overflow &= next.is_some();
next
}
}
let mut iter = iter.into_iter();
let overflow = self.fill_and_keep_tail(Overflow {
overflow: true,
inner: iter.by_ref().fuse(),
}).overflow;
Some(iter).filter(|_| overflow)
}
}
#[cfg(feature = "alloc")]
impl<T> Fill<T> for alloc::vec::Vec<T> {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=T>
{
for item in iter.into_iter().take(self.capacity() - self.len()) {
self.push(item);
}
}
}
#[cfg(feature = "alloc")]
impl<T> Fill<T> for alloc::collections::VecDeque<T> {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=T>
{
for item in iter.into_iter().take(self.capacity() - self.len()) {
self.push_back(item);
}
}
}
impl Fill<()> for () {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=()>
{
for () in iter { }
}
}
impl<T> Fill<T> for Option<T> {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=T>
{
let mut iter = iter.into_iter();
match self {
None => *self = iter.next(),
Some(_) => (),
}
}
}
impl<C, E, T> Fill<Result<T, E>> for Result<C, E>
where C: Fill<T>,
{
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=Result<T, E>>
{
let mut iter = iter.into_iter();
let container = match self {
Ok(container) => container,
Err(_) => return,
};
let err = loop {
match iter.next() {
None => return,
Some(Err(err)) => break err,
Some(Ok(ok)) => {
container.fill(core::iter::once(ok));
},
};
};
*self = Err(err);
}
}
impl<T> Fill<T> for core::slice::IterMut<'_, T> {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=T>
{
let mut iter = iter.into_iter();
while self.len() != 0 {
if let Some(item) = iter.next() {
*self.next().unwrap() = item;
} else {
break
}
}
}
}
impl<'a, T: 'a> Fill<&'a mut T> for core::slice::IterMut<'_, T> {
fn fill<I>(&mut self, iter: I)
where I: IntoIterator<Item=&'a mut T>
{
let mut iter = iter.into_iter();
while self.len() != 0 {
if let Some(item) = iter.next() {
core::mem::swap(self.next().unwrap(), item);
} else {
break
}
}
}
}