max_n/
max_n_trait.rs

1use std::cmp::Ordering;
2use crate::core::max_n_by_from_iter;
3
4pub trait MaxN<T>: Sized {
5    fn max_n<const K: usize>(self) -> [T; K] where T : Ord {
6        self.max_n_by(T::cmp)
7    }
8
9    fn max_n_by<const K: usize>(self, f: impl FnMut(&T, &T) -> Ordering) -> [T; K];
10
11    fn max_n_by_key<const K: usize, U: Ord>(self, mut f: impl FnMut(&T) -> U) -> [T; K] {
12        self.max_n_by(|x, y| f(x).cmp(&f(y)))
13    }
14
15    fn min_n<const K: usize>(self) -> [T; K] where T : Ord {
16        self.max_n_by(|x, y| x.cmp(y).reverse())
17    }
18
19    fn min_n_by<const K: usize>(self, mut f: impl FnMut(&T, &T) -> Ordering) -> [T; K] where T : Ord {
20        self.max_n_by(|x, y| f(x, y).reverse())
21    }
22
23    fn min_n_by_key<const K: usize, U: Ord>(self, mut f: impl FnMut(&T) -> U) -> [T; K] {
24        self.max_n_by(|x, y| f(x).cmp(&f(y)).reverse())
25    }
26}
27
28impl<T, I: Iterator<Item=T>> MaxN<T> for I {
29    fn max_n_by<const K: usize>(self, f: impl FnMut(&T, &T) -> Ordering) -> [T; K] {
30        max_n_by_from_iter(self.into_iter(), f)
31    }
32}
33