use std::collections::{HashMap, HashSet};
use std::hash::Hash;
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
}
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
}
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
}
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
}