use std::{fmt::Debug, iter::FromIterator, ops::Deref};
use peace_core::ItemId;
use serde::Serialize;
use type_reg::{
common::UnknownEntriesSome,
untagged::{BoxDtDisplay, TypeMapOpt},
};
#[derive(Debug, Serialize)]
#[serde(transparent)] pub struct StatesSerde<ValueT>(TypeMapOpt<ItemId, BoxDtDisplay, UnknownEntriesSome<ValueT>>)
where
ValueT: Clone + Debug + PartialEq + Eq;
impl<ValueT> StatesSerde<ValueT>
where
ValueT: Clone + Debug + PartialEq + Eq,
{
pub fn with_capacity(capacity: usize) -> Self {
Self(TypeMapOpt::with_capacity_typed(capacity))
}
pub fn into_inner(self) -> TypeMapOpt<ItemId, BoxDtDisplay, UnknownEntriesSome<ValueT>> {
self.0
}
}
impl<ValueT> Clone for StatesSerde<ValueT>
where
ValueT: Clone + Debug + PartialEq + Eq,
{
fn clone(&self) -> Self {
let mut clone = Self(TypeMapOpt::with_capacity_typed(self.0.len()));
clone.0.extend(
self.0
.iter()
.map(|(item_id, state)| (item_id.clone(), state.clone())),
);
clone
}
}
impl<ValueT> Deref for StatesSerde<ValueT>
where
ValueT: Clone + Debug + PartialEq + Eq,
{
type Target = TypeMapOpt<ItemId, BoxDtDisplay, UnknownEntriesSome<ValueT>>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<ValueT> FromIterator<(ItemId, Option<BoxDtDisplay>)> for StatesSerde<ValueT>
where
ValueT: Clone + Debug + PartialEq + Eq,
{
fn from_iter<T: IntoIterator<Item = (ItemId, Option<BoxDtDisplay>)>>(iter: T) -> Self {
iter.into_iter().fold(
Self(TypeMapOpt::new_typed()),
|mut states_serde, (item_id, state_boxed)| {
states_serde.0.insert_raw(item_id, state_boxed);
states_serde
},
)
}
}
impl<ValueT> From<TypeMapOpt<ItemId, BoxDtDisplay, UnknownEntriesSome<ValueT>>>
for StatesSerde<ValueT>
where
ValueT: Clone + Debug + PartialEq + Eq,
{
fn from(type_map_opt: TypeMapOpt<ItemId, BoxDtDisplay, UnknownEntriesSome<ValueT>>) -> Self {
Self(type_map_opt)
}
}