mod utils;
#[cfg(test)]
mod tests;
pub use self::utils::BuildError;
#[derive(Debug)]
pub struct PaddedIter<T: Iterator<Item = U>, U> {
iter: T,
n: usize,
length: usize,
pad: U,
}
impl<T, U> PaddedIter<T, U>
where
T: Iterator<Item = U>,
U: Clone,
{
pub fn next(&mut self) -> Option<U> {
self.n += 1;
if self.n > self.length {
return None;
}
let next_item = self.iter.next();
match next_item {
Some(item) => Some(item),
None => Some(self.pad.clone()),
}
}
}
impl<T, U> From<(T, usize, U)> for PaddedIter<T, U>
where
T: Iterator<Item = U>,
U: Clone,
{
fn from((iter, length, pad): (T, usize, U)) -> Self {
Self {
iter,
n: 0,
length,
pad,
}
}
}
pub struct PaddedIterBuilder<T: Iterator<Item = U>, U> {
iter: Option<T>,
length: Option<usize>,
pad: Option<U>,
}
impl<T, U> PaddedIterBuilder<T, U>
where
T: Iterator<Item = U>,
U: Clone,
{
pub fn new() -> Self {
PaddedIterBuilder {
iter: None,
length: None,
pad: None,
}
}
pub fn iter(mut self, iter: T) -> Self {
self.iter = Some(iter);
self
}
pub fn length(mut self, length: usize) -> Self {
self.length = Some(length);
self
}
pub fn pad(mut self, pad: U) -> Self {
self.pad = Some(pad);
self
}
pub fn build(self) -> Result<PaddedIter<T, U>, BuildError> {
let iter = self.iter.ok_or(BuildError::IterNotSet)?;
let length = self.length.ok_or(BuildError::LengthNotSet)?;
let pad = self.pad.ok_or(BuildError::PadNotSet)?;
Ok(PaddedIter {
iter,
n: 0,
length,
pad,
})
}
}