1use alloc::{vec, vec::Vec};
2use std::cmp::Ordering;
3
4/// Implementation guts for `min_set`, `min_set_by`, and `min_set_by_key`.
5pub fn min_set_impl<I, K, F, Compare>(
6 mut it: I,
7 mut key_for: F,
8 mut compare: Compare,
9) -> Vec<I::Item>
10where
11 I: Iterator,
12 F: FnMut(&I::Item) -> K,
13 Compare: FnMut(&I::Item, &I::Item, &K, &K) -> Ordering,
14{
15 match it.next() {
16 None => Vec::new(),
17 Some(element: ::Item) => {
18 let mut current_key: K = key_for(&element);
19 let mut result: Vec<::Item> = vec![element];
20 it.for_each(|element: ::Item| {
21 let key: K = key_for(&element);
22 match compare(&element, &result[0], &key, &current_key) {
23 Ordering::Less => {
24 result.clear();
25 result.push(element);
26 current_key = key;
27 }
28 Ordering::Equal => {
29 result.push(element);
30 }
31 Ordering::Greater => {}
32 }
33 });
34 result
35 }
36 }
37}
38
39/// Implementation guts for `ax_set`, `max_set_by`, and `max_set_by_key`.
40pub fn max_set_impl<I, K, F, Compare>(it: I, key_for: F, mut compare: Compare) -> Vec<I::Item>
41where
42 I: Iterator,
43 F: FnMut(&I::Item) -> K,
44 Compare: FnMut(&I::Item, &I::Item, &K, &K) -> Ordering,
45{
46 min_set_impl(it, key_for, |it1: &::Item, it2: &::Item, key1: &K, key2: &K| {
47 compare(it2, it1, key2, key1)
48 })
49}
50