kudzu 0.1.0

concurrent, grow-only data structures
Documentation
use std::borrow::Borrow;
use std::cmp::Ordering;

use crate::{SkipList, AbstractOrd, QWrapper};

pub struct Map<K, V> {
    inner: SkipList<KeyValue<K, V>>,
}

impl<K: Ord, V> Map<K, V> {
    pub fn new() -> Map<K, V> {
        Map { inner: SkipList::new() }
    }

    pub fn insert(&self, key: K, value: V) -> Option<(K, V)> {
        self.inner.insert(KeyValue(key, value)).map(|KeyValue(k, v)| (k, v))
    }

    pub fn contains<Q>(&self, key: &Q) -> bool
    where
        Q: Ord + ?Sized,
        K: Borrow<Q>,
    {
        self.get(key).is_some()
    }

    pub fn get<Q>(&self, key: &Q) -> Option<&V>
    where
        Q: Ord + ?Sized,
        K: Borrow<Q>,
    {
        self.inner.get(QWrapper::new(key)).map(|KeyValue(_, v)| v)
    }
}

struct KeyValue<K, V>(K, V);

impl<K: Ord, V> AbstractOrd<KeyValue<K, V>> for KeyValue<K, V> {
    fn cmp(&self, rhs: &KeyValue<K, V>) -> Ordering {
        Ord::cmp(&self.0, &rhs.0)
    }
}

impl<K, V, Q> AbstractOrd<KeyValue<K, V>> for QWrapper<Q>
where
    K: Ord + Borrow<Q>,
    Q: Ord + ?Sized,
{
    fn cmp(&self, rhs: &KeyValue<K, V>) -> Ordering {
        Ord::cmp(&self.0, rhs.0.borrow())
    }
}