iterator sizing lib
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs35
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)
+ }
+}