opmph/
lib.rs

1use std::collections::BTreeSet;
2
3// order-preserving minimal perfect hashing
4pub 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}