Skip to main content

pokebase_core/
map.rs

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}