selene-core 0.3.0

selene-core is the backend for Selene, a local-first music player
Documentation
/// Logic defining how `self` can be patched by `T`
pub trait Patchable<T> {
    fn patch(&mut self, patch: T);
}

pub(crate) fn patch_replace<T>(target: &mut T, patch: Option<T>) {
    if let Some(value) = patch {
        *target = value;
    }
}

pub(crate) fn patch_option_replace<T>(target: &mut Option<T>, patch: Option<T>) {
    if let Some(value) = patch {
        *target = Some(value);
    }
}

pub(crate) fn patch_vec<T: Eq>(target: &mut Vec<T>, patch: Vec<T>) {
    for item in patch {
        if !target.contains(&item) {
            target.push(item);
        }
    }
}

pub(crate) fn patch_vec_merge<T: Eq + Patchable<T>>(target: &mut Vec<T>, patch: Vec<T>) {
    for item in patch {
        if let Some(existing) = target.iter_mut().find(|t| *t == &item) {
            existing.patch(item);
        } else {
            target.push(item);
        }
    }
}