1use std::sync::Arc;
2
3use std::borrow::Borrow;
4use std::collections::BTreeMap;
5
6#[derive(Debug)]
7pub struct Map<K, V>(Arc<Inner<K, V>>);
8
9#[derive(Debug)]
10struct Inner<K, V> {
11 entries: BTreeMap<K, usize>,
12 values: Vec<V>,
13}
14
15impl<K, V> Map<K, V> {
16 pub fn new(values: Vec<V>, to_key: impl Fn(&V) -> K) -> Self
17 where
18 K: Ord,
19 {
20 Self(Arc::new(Inner {
21 entries: BTreeMap::from_iter(
22 values
23 .iter()
24 .enumerate()
25 .map(|(i, value)| (to_key(value), i)),
26 ),
27 values,
28 }))
29 }
30
31 pub fn get<Q>(&self, key: &Q) -> Option<&V>
32 where
33 K: Borrow<Q> + Ord,
34 Q: Ord,
35 {
36 Some(&self.0.values[*self.0.entries.get(key)?])
37 }
38
39 pub fn len(&self) -> usize {
40 self.0.values.len()
41 }
42
43 pub fn is_empty(&self) -> bool {
44 self.0.values.is_empty()
45 }
46
47 pub fn values(&self) -> &[V] {
48 &self.0.values
49 }
50}
51
52impl<K, V> Clone for Map<K, V> {
53 fn clone(&self) -> Self {
54 Self(self.0.clone())
55 }
56}