[][src]Function iter_set::intersection_by

pub fn intersection_by<T, L, R, F>(
    a: L,
    b: R,
    cmp: F
) -> impl Iterator<Item = T> where
    L: IntoIterator<Item = T>,
    R: IntoIterator<Item = T>,
    F: FnMut(&mut T, &mut T) -> Ordering

Compare two sets represented by sorted, deduplicated iterators, using a comparator function.

Note that since this passes elements to the comparator function as &mut T, you can swap them to override the default behaviour of returning duplicate elements from a.

See intersection.

Examples

Using the comparator function to choose which iterator to take from.

use std::cmp::Ordering::{self, Equal};
use std::mem::swap;
use iter_set::intersection_by;

let mut a = [(1, vec![2]), (2, vec![])];
let mut b = [(2, vec![1]), (3, vec![])];

fn compare(l: &mut (u32, Vec<i32>), r: &mut (u32, Vec<i32>)) -> Ordering {
    match Ord::cmp(&l.0, &r.0) {
       Equal => {
           if r.1.len() > l.1.len() {
               swap(r, l);
           }
           Equal
       }
       neq => neq,
    }
}

assert!(intersection_by(&mut a, &mut b, |l, r| compare(*l, *r)).eq(&[(2, vec![1])]));