iterator_sorted/
lib.rs

1// Copyright 2021-2022 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4//! Provides `stable` functions for checking that an `Iterator` is sorted.
5
6#![no_std]
7#![deny(missing_docs)]
8
9use core::{cmp::Ordering, iter::Iterator};
10
11/// Checks if an iterator yields ordered and unique values based on a given comparator.
12pub fn is_unique_sorted_by<T: Ord, I: Iterator<Item = T>, F: FnMut(&T, &T) -> Ordering>(
13    mut iterator: I,
14    mut cmp: F,
15) -> bool {
16    let mut previous = match iterator.next() {
17        Some(e) => e,
18        None => return true,
19    };
20
21    for curr in iterator {
22        if cmp(&previous, &curr) != Ordering::Less {
23            return false;
24        }
25        previous = curr;
26    }
27
28    true
29}
30
31/// Checks if an iterator yields ordered and unique values.
32pub fn is_unique_sorted<T: Ord, I: Iterator<Item = T>>(iterator: I) -> bool {
33    is_unique_sorted_by(iterator, T::cmp)
34}
35
36/// Checks if an iterator yields ordered values based on a given comparator.
37pub fn is_sorted_by<T: Ord, I: Iterator<Item = T>, F: FnMut(&T, &T) -> Ordering>(mut iterator: I, mut cmp: F) -> bool {
38    let mut previous = match iterator.next() {
39        Some(e) => e,
40        None => return true,
41    };
42
43    for curr in iterator {
44        if cmp(&previous, &curr) == Ordering::Greater {
45            return false;
46        }
47        previous = curr;
48    }
49
50    true
51}
52
53/// Checks if an iterator yields ordered values.
54pub fn is_sorted<T: Ord, I: Iterator<Item = T>>(iterator: I) -> bool {
55    is_sorted_by(iterator, T::cmp)
56}