1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use std::default::Default;

pub fn get_mut_or_set<T, F>(opt: &mut Option<T>, f: F) -> &mut T
    where F: Fn() -> T
{
    if opt.is_none() {
        *opt = Some(f());
    }
    opt.as_mut().unwrap()
}

pub fn set_default<T: Default>(opt: &mut Option<T>) -> &mut T {
    get_mut_or_set(opt, Default::default)
}

pub fn replace<T>(opt: &mut Option<T>, target: Option<T>) {
    let old = opt.take();
    *opt = target.or(old);
}

pub fn merge_vec<T, I>(base: &mut Vec<T>, data: I)
    where T: PartialEq, I: Iterator<Item=T>
{
    for i in data {
        if !base.contains(&i) {
            base.push(i);
        }
    }
}