iterator sizing lib
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..86bb130 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,35 @@ +/// Provides a hint for an iterator. +pub struct Hinted<I: Iterator> { + /// Wrapped iterator. + pub iter: I, + /// Size hint, decreased on every call to [`next()`](Iterator::next). + pub hint: usize, +} + +/// Set the size hint for an iterator. +pub trait HintExt: Iterator +where + Self: Sized, +{ + fn hinted(self, hint: usize) -> Hinted<Self> { + Hinted { iter: self, hint } + } +} + +impl<I: Iterator> HintExt for I {} + +impl<I> Iterator for Hinted<I> +where + I: Iterator + Sized, +{ + type Item = <I as Iterator>::Item; + + fn next(&mut self) -> Option<Self::Item> { + self.hint = self.hint.saturating_sub(1); + self.iter.next() + } + + fn size_hint(&self) -> (usize, Option<usize>) { + (self.hint, self.iter.size_hint().1) + } +} |