pub mod cmp {
pub fn max_by_key<A, B: Ord>(a: A, b: A, key: impl Fn(&A) -> B) -> A {
if key(&a) > key(&b) {
a
} else {
b
}
}
pub fn min_by_key<A, B: Ord>(a: A, b: A, key: impl Fn(&A) -> B) -> A {
if key(&a) <= key(&b) {
a
} else {
b
}
}
}
pub mod option {
pub fn select<A>(a: Option<A>, b: Option<A>, f: impl FnOnce(A, A) -> A) -> Option<A> {
match (a, b) {
(None, b) => b,
(a, None) => a,
(Some(a), Some(b)) => Some(f(a, b)),
}
}
}