1
2
3
4
5
6
7
8
9
10
11
12
13
14
pub trait Mergable {
    fn merge(&self, b: &Self) -> Self;
}

/// Merge optional mergables together given mergable a & b where b takes presedence
pub fn merge_option<T: Mergable + std::clone::Clone>(a: &Option<T>, b: &Option<T>) -> Option<T> {
    b.as_ref()
        .map(|bb| {
            a.as_ref()
                .map(|aa| aa.merge(bb))
                .unwrap_or_else(|| (*bb).clone())
        })
        .or_else(|| a.clone())
}