Documentation
use std::collections::{HashMap, HashSet};
use std::hash::Hash;


/// group slice分组
pub fn group<K, V>(list: &Vec<V>, kf: fn(t: &V) -> K) -> HashMap<K, Vec<V>>
where
    K: Eq + Hash,
    V: Clone,
{
    let mut ret: HashMap<K, Vec<V>> = HashMap::new();
    for v in list {
        let k = kf(v);
        if ret.contains_key(&k) {
            if let Some(l) = ret.get_mut(&k) {
                l.push(v.clone());
            }
        } else {
            ret.insert(k, vec![v.clone()]);
        }
    }
    ret
}

/// group slice分组
pub fn group_customer<K, V, T>(list: &Vec<V>, kf: fn(t: &V) -> (K, T)) -> HashMap<K, Vec<T>>
where
    K: Eq + Hash,
    V: Clone,
{
    let mut ret: HashMap<K, Vec<T>> = HashMap::new();
    for v in list {
        let (k, t) = kf(v);
        if ret.contains_key(&k) {
            if let Some(l) = ret.get_mut(&k) {
                l.push(t);
            }
        } else {
            ret.insert(k, vec![t]);
        }
    }
    ret
}
/// group slice分组
pub fn group_key_set<K, V, T>(list: &Vec<V>, kf: fn(t: &V) -> (K, T)) -> HashMap<K, HashSet<T>>
where
    K: Eq + Hash,
    T: Eq + Hash,
    V: Clone,
{
    let mut ret: HashMap<K, HashSet<T>> = HashMap::new();
    for v in list {
        let (k, t) = kf(v);
        if ret.contains_key(&k) {
            if let Some(l) = ret.get_mut(&k) {
                l.insert(t);
            }
        } else {
            let mut set = HashSet::new();
            set.insert(t);
            ret.insert(k, set);
        }
    }
    ret
}

/// group slice分组
pub fn to_map<K, V, T>(list: &Vec<T>, kf: fn(t: &T) -> (K, V)) -> HashMap<K, V>
where
    K: Eq + Hash,
{
    let mut ret: HashMap<K, V> = HashMap::new();
    for t in list {
        let (k, v) = kf(t);
        ret.insert(k, v);
    }
    ret
}

pub trait TNode
where
    Self: Sized + Clone,
{
    fn id(&self) -> String;
    fn pid(&self) -> String;
    fn set_chrildren(&mut self, c: Vec<Self>);
}

pub fn create_tree<T>(mut list: Vec<T>, pid: &str) -> Vec<T>
where
    T: TNode,
{
    let mut tree = vec![];
    let mut idx = 0;
    for mut ele in list.clone() {
        idx += 1;
        if ele.pid().eq(pid) {
            idx -= 1;
            list.remove(idx);
            if !ele.id().eq(&ele.pid()) {
                ele.set_chrildren(create_tree(list.clone(), &ele.id()));
            }
            tree.push(ele);
        }
    }
    tree
}