use std::collections::HashMap;
use std::fmt::Debug;
use crate::{Stem, StemNode};
pub trait NodeStore: Clone + Debug + Send + Sync {
fn get(&self, stem: &Stem) -> Option<&StemNode>;
fn get_mut(&mut self, stem: &Stem) -> Option<&mut StemNode>;
fn get_or_create(&mut self, stem: Stem) -> &mut StemNode;
fn remove(&mut self, stem: &Stem);
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn iter(&self) -> impl Iterator<Item = (&Stem, &StemNode)>;
fn value_count(&self) -> usize;
fn reserve(&mut self, _additional: usize) {}
}
#[derive(Clone, Debug)]
pub struct InMemoryStore {
stems: HashMap<Stem, StemNode>,
}
impl InMemoryStore {
#[must_use]
pub fn new() -> Self {
Self {
stems: HashMap::new(),
}
}
#[must_use]
pub fn with_capacity(capacity: usize) -> Self {
Self {
stems: HashMap::with_capacity(capacity),
}
}
}
impl Default for InMemoryStore {
fn default() -> Self {
Self::new()
}
}
impl NodeStore for InMemoryStore {
fn get(&self, stem: &Stem) -> Option<&StemNode> {
self.stems.get(stem)
}
fn get_mut(&mut self, stem: &Stem) -> Option<&mut StemNode> {
self.stems.get_mut(stem)
}
fn get_or_create(&mut self, stem: Stem) -> &mut StemNode {
self.stems
.entry(stem)
.or_insert_with(|| StemNode::new(stem))
}
fn remove(&mut self, stem: &Stem) {
self.stems.remove(stem);
}
fn len(&self) -> usize {
self.stems.len()
}
fn is_empty(&self) -> bool {
self.stems.is_empty()
}
fn iter(&self) -> impl Iterator<Item = (&Stem, &StemNode)> {
self.stems.iter()
}
fn value_count(&self) -> usize {
self.stems.values().map(|s| s.values.len()).sum()
}
fn reserve(&mut self, additional: usize) {
self.stems.reserve(additional);
}
}