use std;
use std::collections::HashMap;
pub fn group<T>(xs: &[T]) -> (Vec<&T>, HashMap<&T,Vec<usize>>)
where T: std::hash::Hash, T: std::cmp::Eq {
let mut map:HashMap<&T,Vec<usize>> = HashMap::new();
let mut nub = vec![]; for (i,k) in xs.iter().enumerate() {
let kxs = map.entry(k).or_default();
nub.push(k); kxs.push(i) }
(nub, map) }
pub fn gradeup<T>(xs: &[T]) -> Vec<usize>
where T: std::cmp::Ord {
let mut ixs:Vec<(usize,&T)> = xs.iter().enumerate().collect();
ixs.sort_by_key(|ix|ix.1); ixs.iter().map(|ix|ix.0).collect()}
pub fn at<'a,T:Clone>(xs:&'a[T], ys:&'a[usize]) -> Vec<T> {
ys.iter().map(|&i| xs[i].clone()).collect() }