use std::cmp::{max, Ord, Ordering}; use crate::{Driver, Executor, ParallelIterator}; /* Max */ pub struct Max { iterator: X, } impl Max { pub fn new(iterator: X) -> Self { Self { iterator } } } impl<'a, X, T> Driver<'a, Option> for Max where X: ParallelIterator<'a, Item = T>, T: Send + Ord + 'a, { fn exec_with(self, executor: E) -> E::Result where E: Executor<'a, Option>, { self.iterator.reduce_with(max).exec_with(executor) } } /* MaxBy */ pub struct MaxBy { iterator: X, operation: O, } impl MaxBy { pub fn new(iterator: X, operation: O) -> Self { Self { iterator, operation, } } } impl<'a, X, O, T> Driver<'a, Option> for MaxBy where X: ParallelIterator<'a, Item = T>, O: Fn(&T, &T) -> Ordering + Clone + Send + Sync + 'a, T: Send + Ord + 'a, { fn exec_with(self, executor: E) -> E::Result where E: Executor<'a, Option>, { let operation = self.operation; self.iterator .reduce_with(move |a, b| match operation(&a, &b) { Ordering::Greater => b, _ => a, }) .exec_with(executor) } }