steepen/
steepen_strict.rs

1use crate::steepen_compat::SteepenCompat;
2use crate::Separator;
3use std::fmt::{Debug, Formatter};
4
5/// Iterator that yields blocks of strictly ascending elements.
6///
7/// The block elements must implement [`FromIterator`]
8///
9/// This `struct` is created by the [`steepen`] method from [`Steepenable`] and the other similar
10/// methods. See its documentation for more.
11///
12/// [`Steepenable`]: crate::steepenable::Steepenable
13/// [`steepen`]: crate::steepenable::Steepenable::steepen()
14pub struct SteepenStrict<I: Iterator, B> {
15	inner: SteepenCompat<I, B, Separator<I::Item>>,
16}
17
18impl<I, B> SteepenStrict<I, B>
19where
20	I: Iterator,
21	I::Item: Ord,
22{
23	#[inline]
24	pub(crate) fn new(iterator: I) -> Self {
25		SteepenStrict {
26			inner: SteepenCompat::new(iterator, |a, b| a >= b),
27		}
28	}
29}
30
31impl<I, B> Iterator for SteepenStrict<I, B>
32where
33	I: Iterator,
34	B: FromIterator<I::Item>,
35{
36	type Item = B;
37
38	#[inline]
39	fn next(&mut self) -> Option<B> {
40		self.inner.next()
41	}
42}
43
44impl<I, B> Debug for SteepenStrict<I, B>
45where
46	I: Debug + Iterator,
47	I::Item: Debug,
48{
49	#[inline]
50	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
51		f.debug_struct("SteepenStrict")
52			.field("inner", &self.inner)
53			.finish()
54	}
55}
56
57impl<I, B> Default for SteepenStrict<I, B>
58where
59	I: Iterator + Default,
60	I::Item: Ord,
61{
62	#[inline]
63	fn default() -> Self {
64		SteepenStrict::new(I::default())
65	}
66}