ducklake 0.0.9

Rust SDK for DuckLake.
Documentation
use indexmap::IndexMap;
use itertools::{EitherOrBoth, Itertools};

pub fn iter_index_map_diff<'a, K, V>(
    lhs: &'a IndexMap<K, V>,
    rhs: &'a IndexMap<K, V>,
) -> impl Iterator<Item = EitherOrBoth<(&'a K, &'a V)>>
where
    K: Ord,
{
    let iter_lhs = lhs.iter().sorted_by_key(|(k, _)| *k);
    let iter_rhs = rhs.iter().sorted_by_key(|(k, _)| *k);
    iter_lhs.merge_join_by(iter_rhs, |(k1, _), (k2, _)| k1.cmp(k2))
}

pub fn iter_vec_diff<'a, T, K>(
    lhs: &'a [T],
    rhs: &'a [T],
    key_fn: impl Fn(&T) -> K + 'a,
) -> impl Iterator<Item = EitherOrBoth<&'a T>>
where
    K: Ord,
{
    let iter_lhs = lhs.iter().sorted_by_key(|v| key_fn(v));
    let iter_rhs = rhs.iter().sorted_by_key(|v| key_fn(v));
    iter_lhs.merge_join_by(iter_rhs, move |v1, v2| key_fn(v1).cmp(&key_fn(v2)))
}