use std::collections::HashMap;
use super::{Book, BookEntry, BookKey, BookMove};
#[derive(Debug, Default)]
pub struct MemoryBook {
entries: HashMap<BookKey, Vec<BookMove>>,
}
impl MemoryBook {
#[must_use]
pub fn new() -> Self {
Self { entries: HashMap::new() }
}
#[must_use]
pub fn entry_count(&self) -> usize {
self.entries.len()
}
pub fn insert_move(&mut self, key: BookKey, book_move: BookMove) {
self.entries.entry(key).or_default().push(book_move);
}
pub fn extend_moves<I>(&mut self, key: BookKey, moves: I)
where
I: IntoIterator<Item = BookMove>,
{
self.entries.entry(key).or_default().extend(moves);
}
#[must_use]
pub fn moves(&self, key: BookKey) -> Option<&[BookMove]> {
self.entries.get(&key).map(|moves| moves.as_slice())
}
pub(crate) fn entries(&self) -> &HashMap<BookKey, Vec<BookMove>> {
&self.entries
}
#[cfg(feature = "records")]
pub(crate) fn entries_mut(&mut self) -> &mut HashMap<BookKey, Vec<BookMove>> {
&mut self.entries
}
}
impl Book for MemoryBook {
fn get(&self, key: BookKey) -> Option<BookEntry<'_>> {
let moves = self.entries.get(&key)?;
Some(BookEntry::new(key, moves))
}
fn len(&self) -> usize {
self.entries.len()
}
}