1use std::collections::BTreeSet;
2
3pub trait Opmph<B> {
5 fn opmph(&self) -> B;
6}
7
8impl<I, T, B> Opmph<B> for I
9where
10 for<'a> &'a I: IntoIterator<Item = &'a T>,
11 T: Clone + Ord,
12 B: FromIterator<(T, usize)>,
13{
14 fn opmph(&self) -> B {
15 let seen: BTreeSet<_> = self.into_iter().cloned().collect();
16 seen.into_iter().zip(0..).collect()
17 }
18}
19
20#[cfg(test)]
21mod tests {
22 use std::collections::BTreeMap;
23
24 use maplit::btreemap;
25
26 use super::*;
27
28 #[test]
29 fn sanity_check() {
30 let a = vec![3, 5, 1, 2, 5];
31 let enc: BTreeMap<_, _> = a.opmph();
32
33 assert_eq!(enc, btreemap! { 1 => 0, 2 => 1, 3 => 2, 5 => 3 });
34 }
35}