use std::collections::HashMap;
pub struct DataTable<T>
where
T: Send + Sync,
{
rows: HashMap<String, T>,
}
impl<T> Default for DataTable<T>
where
T: Send + Sync,
{
fn default() -> Self {
Self {
rows: Default::default(),
}
}
}
impl<T> std::fmt::Debug for DataTable<T>
where
T: std::fmt::Debug + Send + Sync,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("DataTable")
.field("rows", &self.rows)
.finish()
}
}
impl<T> Clone for DataTable<T>
where
T: Clone + Send + Sync,
{
fn clone(&self) -> Self {
Self {
rows: self.rows.clone(),
}
}
}
impl<T> DataTable<T>
where
T: Send + Sync,
{
pub fn len(&self) -> usize {
self.rows.len()
}
pub fn is_empty(&self) -> bool {
self.rows.is_empty()
}
pub fn has_row(&self, name: &str) -> bool {
self.rows.contains_key(name)
}
pub fn get(&self, name: &str) -> Option<&T> {
self.rows.get(name)
}
pub fn get_mut(&mut self, name: &str) -> Option<&mut T> {
self.rows.get_mut(name)
}
pub fn set(&mut self, name: String, value: T) {
self.rows.insert(name, value);
}
pub fn with<R, F>(&mut self, name: &str, mut f: F) -> Option<R>
where
F: FnMut(&mut T) -> R,
{
if let Some(value) = self.rows.get_mut(name) {
return Some(f(value));
}
None
}
pub fn remove(&mut self, name: &str) -> bool {
self.rows.remove(name).is_some()
}
pub fn clear(&mut self) {
self.rows.clear();
}
pub fn keys(&self) -> impl Iterator<Item = &str> {
self.rows.keys().map(|k| k.as_str())
}
pub fn values(&self) -> impl Iterator<Item = &T> {
self.rows.values()
}
pub fn iter(&self) -> impl Iterator<Item = (&str, &T)> {
self.rows.iter().map(|(k, v)| (k.as_str(), v))
}
}