alist 0.1.0

Association list offering fast lookups while preserving insertion order
Documentation
use core::fmt;

use crate::AList;

pub struct OccupiedEntry<'a, K, V> {
    alist: &'a mut AList<K, V>,
    position: usize,
}

impl<'a, K, V> OccupiedEntry<'a, K, V> {
    pub(super) fn new(alist: &'a mut AList<K, V>, position: usize) -> Self {
        Self { alist, position }
    }

    pub fn get(&self) -> &V {
        let (_, v) = &self.alist.pairs[self.position];
        v
    }

    pub fn get_mut(&mut self) -> &mut V {
        let (_, v) = &mut self.alist.pairs[self.position];
        v
    }

    pub fn insert(&mut self, value: V) -> V {
        std::mem::replace(self.get_mut(), value)
    }

    pub fn into_mut(self) -> &'a mut V {
        let (_, v) = &mut self.alist.pairs[self.position];
        v
    }

    pub fn key(&self) -> &K {
        let (k, _) = &self.alist.pairs[self.position];
        k
    }

    pub fn remove(self) -> V {
        let (_, v) = self.alist.pairs.swap_remove(self.position);
        v
    }

    pub fn remove_entry(self) -> (K, V) {
        self.alist.pairs.swap_remove(self.position)
    }
}

impl<'a, K: fmt::Debug, V: fmt::Debug> fmt::Debug for OccupiedEntry<'a, K, V> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("OccupiedEntry")
            .field("key", self.key())
            .field("value", self.get())
            .finish()
    }
}