use ::{Comparer, ComparerMut};
pub trait SliceCompareExt<T> {
fn self_comparer(&self) -> Comparer<T>;
fn self_comparer_mut(&mut self) -> ComparerMut<T>;
fn compare_self<F: FnMut(&T, &T)>(&self, mut f: F) {
for (a, b) in self.self_comparer() {
f(a, b)
}
}
fn compare_self_enumerated<F: FnMut((usize, &T), (usize, &T))>(&self, mut f: F) {
let mut c = self.self_comparer();
while let Some((a, b)) = c.next_enumerated() {
f(a, b);
}
}
fn compare_self_mut<F: FnMut(&mut T, &mut T)>(&mut self, mut f: F) {
let mut c = self.self_comparer_mut();
while let Some((a, b)) = c.next() {
f(a, b)
}
}
fn compare_self_enumerated_mut<F: FnMut((usize, &mut T), (usize, &mut T))>(&mut self, mut f: F) {
let mut c = self.self_comparer_mut();
while let Some((a, b)) = c.next_enumerated() {
f(a, b);
}
}
}
impl<T> SliceCompareExt<T> for [T] {
fn self_comparer(&self) -> Comparer<T> {
Comparer::new(self)
}
fn self_comparer_mut(&mut self) -> ComparerMut<T> {
ComparerMut::new(self)
}
}