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