Skip to main content

selene_core/database/
patchable.rs

1/// Logic defining how `self` can be patched by `T`
2pub trait Patchable<T> {
3    fn patch(&mut self, patch: T);
4}
5
6pub(crate) fn patch_replace<T>(target: &mut T, patch: Option<T>) {
7    if let Some(value) = patch {
8        *target = value;
9    }
10}
11
12pub(crate) fn patch_option_replace<T>(target: &mut Option<T>, patch: Option<T>) {
13    if let Some(value) = patch {
14        *target = Some(value);
15    }
16}
17
18pub(crate) fn patch_vec<T: Eq>(target: &mut Vec<T>, patch: Vec<T>) {
19    for item in patch {
20        if !target.contains(&item) {
21            target.push(item);
22        }
23    }
24}
25
26pub(crate) fn patch_vec_merge<T: Eq + Patchable<T>>(target: &mut Vec<T>, patch: Vec<T>) {
27    for item in patch {
28        if let Some(existing) = target.iter_mut().find(|t| *t == &item) {
29            existing.patch(item);
30        } else {
31            target.push(item);
32        }
33    }
34}