pokebase-core 0.1.0

An embedded database of Pokémon TCG
Documentation
use std::sync::Arc;

use std::borrow::Borrow;
use std::collections::BTreeMap;

#[derive(Debug)]
pub struct Map<K, V>(Arc<Inner<K, V>>);

#[derive(Debug)]
struct Inner<K, V> {
    entries: BTreeMap<K, usize>,
    values: Vec<V>,
}

impl<K, V> Map<K, V> {
    pub fn new(values: Vec<V>, to_key: impl Fn(&V) -> K) -> Self
    where
        K: Ord,
    {
        Self(Arc::new(Inner {
            entries: BTreeMap::from_iter(
                values
                    .iter()
                    .enumerate()
                    .map(|(i, value)| (to_key(value), i)),
            ),
            values,
        }))
    }

    pub fn get<Q>(&self, key: &Q) -> Option<&V>
    where
        K: Borrow<Q> + Ord,
        Q: Ord,
    {
        Some(&self.0.values[*self.0.entries.get(key)?])
    }

    pub fn len(&self) -> usize {
        self.0.values.len()
    }

    pub fn is_empty(&self) -> bool {
        self.0.values.is_empty()
    }

    pub fn values(&self) -> &[V] {
        &self.0.values
    }
}

impl<K, V> Clone for Map<K, V> {
    fn clone(&self) -> Self {
        Self(self.0.clone())
    }
}