summaryrefslogtreecommitdiff
path: root/vendor/itertools-0.12.1/src/with_position.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/itertools-0.12.1/src/with_position.rs')
-rw-r--r--vendor/itertools-0.12.1/src/with_position.rs124
1 files changed, 0 insertions, 124 deletions
diff --git a/vendor/itertools-0.12.1/src/with_position.rs b/vendor/itertools-0.12.1/src/with_position.rs
deleted file mode 100644
index 2d56bb9b..00000000
--- a/vendor/itertools-0.12.1/src/with_position.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-use std::fmt;
-use std::iter::{Fuse, FusedIterator, Peekable};
-
-/// An iterator adaptor that wraps each element in an [`Position`].
-///
-/// Iterator element type is `(Position, I::Item)`.
-///
-/// See [`.with_position()`](crate::Itertools::with_position) for more information.
-#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
-pub struct WithPosition<I>
-where
- I: Iterator,
-{
- handled_first: bool,
- peekable: Peekable<Fuse<I>>,
-}
-
-impl<I> fmt::Debug for WithPosition<I>
-where
- I: Iterator,
- Peekable<Fuse<I>>: fmt::Debug,
-{
- debug_fmt_fields!(WithPosition, handled_first, peekable);
-}
-
-impl<I> Clone for WithPosition<I>
-where
- I: Clone + Iterator,
- I::Item: Clone,
-{
- clone_fields!(handled_first, peekable);
-}
-
-/// Create a new `WithPosition` iterator.
-pub fn with_position<I>(iter: I) -> WithPosition<I>
-where
- I: Iterator,
-{
- WithPosition {
- handled_first: false,
- peekable: iter.fuse().peekable(),
- }
-}
-
-/// The first component of the value yielded by `WithPosition`.
-/// Indicates the position of this element in the iterator results.
-///
-/// See [`.with_position()`](crate::Itertools::with_position) for more information.
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
-pub enum Position {
- /// This is the first element.
- First,
- /// This is neither the first nor the last element.
- Middle,
- /// This is the last element.
- Last,
- /// This is the only element.
- Only,
-}
-
-impl<I: Iterator> Iterator for WithPosition<I> {
- type Item = (Position, I::Item);
-
- fn next(&mut self) -> Option<Self::Item> {
- match self.peekable.next() {
- Some(item) => {
- if !self.handled_first {
- // Haven't seen the first item yet, and there is one to give.
- self.handled_first = true;
- // Peek to see if this is also the last item,
- // in which case tag it as `Only`.
- match self.peekable.peek() {
- Some(_) => Some((Position::First, item)),
- None => Some((Position::Only, item)),
- }
- } else {
- // Have seen the first item, and there's something left.
- // Peek to see if this is the last item.
- match self.peekable.peek() {
- Some(_) => Some((Position::Middle, item)),
- None => Some((Position::Last, item)),
- }
- }
- }
- // Iterator is finished.
- None => None,
- }
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- self.peekable.size_hint()
- }
-
- fn fold<B, F>(mut self, mut init: B, mut f: F) -> B
- where
- F: FnMut(B, Self::Item) -> B,
- {
- if let Some(mut head) = self.peekable.next() {
- if !self.handled_first {
- // The current head is `First` or `Only`,
- // it depends if there is another item or not.
- match self.peekable.next() {
- Some(second) => {
- let first = std::mem::replace(&mut head, second);
- init = f(init, (Position::First, first));
- }
- None => return f(init, (Position::Only, head)),
- }
- }
- // Have seen the first item, and there's something left.
- init = self.peekable.fold(init, |acc, mut item| {
- std::mem::swap(&mut head, &mut item);
- f(acc, (Position::Middle, item))
- });
- // The "head" is now the last item.
- init = f(init, (Position::Last, head));
- }
- init
- }
-}
-
-impl<I> ExactSizeIterator for WithPosition<I> where I: ExactSizeIterator {}
-
-impl<I: Iterator> FusedIterator for WithPosition<I> {}