use std::{
marker::PhantomData,
ops::{Deref, DerefMut},
};
use peace_core::ItemId;
use serde::Serialize;
use type_reg::untagged::{BoxDtDisplay, TypeMap};
#[derive(Debug, Serialize)]
pub struct StatesMut<TS>(TypeMap<ItemId, BoxDtDisplay>, PhantomData<TS>);
impl<TS> StatesMut<TS> {
pub fn new() -> Self {
Self::default()
}
pub fn with_capacity(capacity: usize) -> Self {
Self(TypeMap::with_capacity_typed(capacity), PhantomData)
}
pub fn into_inner(self) -> TypeMap<ItemId, BoxDtDisplay> {
self.0
}
}
impl<TS> Default for StatesMut<TS> {
fn default() -> Self {
Self(TypeMap::default(), PhantomData)
}
}
impl<TS> Deref for StatesMut<TS> {
type Target = TypeMap<ItemId, BoxDtDisplay>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<TS> DerefMut for StatesMut<TS> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<TS> From<TypeMap<ItemId, BoxDtDisplay>> for StatesMut<TS> {
fn from(type_map: TypeMap<ItemId, BoxDtDisplay>) -> Self {
Self(type_map, PhantomData)
}
}
impl<TS> Extend<(ItemId, BoxDtDisplay)> for StatesMut<TS> {
fn extend<T: IntoIterator<Item = (ItemId, BoxDtDisplay)>>(&mut self, iter: T) {
iter.into_iter().for_each(|(item_id, state)| {
self.insert_raw(item_id, state);
});
}
}