Skip to content

Commit e3fe1f5

Browse files
committed
is_first/is_last to ease handling of Position::Only
1 parent f26119e commit e3fe1f5

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1948,7 +1948,7 @@ pub trait Itertools: Iterator {
19481948
}
19491949

19501950
/// Return an iterator adaptor that combines each element with a `Position` to
1951-
/// ease special-case handling of the first or last elements.
1951+
/// ease special-case handling of the first, last, or [singular](Position::Only) elements.
19521952
///
19531953
/// Iterator element type is
19541954
/// [`(Position, Self::Item)`](Position)

src/with_position.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,36 @@ where
4545
/// The first component of the value yielded by `WithPosition`.
4646
/// Indicates the position of this element in the iterator results.
4747
///
48+
/// When handling the [first](Position::is_first) or [last](Position::is_last) position,
49+
/// remember to consider the special case of [`Position::Only`].
50+
///
4851
/// See [`.with_position()`](crate::Itertools::with_position) for more information.
4952
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
5053
pub enum Position {
51-
/// This is the first element.
54+
/// This is the first element, and there is more than one element.
5255
First,
5356
/// This is neither the first nor the last element.
5457
Middle,
55-
/// This is the last element.
58+
/// This is the last element, and there was more than one element.
5659
Last,
5760
/// This is the only element.
61+
///
62+
/// Makes [`.is_first()`](Position::is_first) and [`.is_last()`](Position::is_last) true at the same time.
5863
Only,
5964
}
6065

66+
impl Position {
67+
/// Unlike `position == First`, it's also true for [`Position::Only`]
68+
pub fn is_first(self) -> bool {
69+
self == Self::First || self == Self::Only
70+
}
71+
72+
/// Unlike `position == Last`, it's also true for [`Position::Only`]
73+
pub fn is_last(self) -> bool {
74+
self == Self::Last || self == Self::Only
75+
}
76+
}
77+
6178
impl<I: Iterator> Iterator for WithPosition<I> {
6279
type Item = (Position, I::Item);
6380

0 commit comments

Comments
 (0)