use core::cell::Cell;
use serde::ser::{Serialize, Serializer};
use crate::error::PondError;
use super::Dataset;
#[derive(Debug)]
pub struct CellDataset<T: Copy> {
value: Cell<Option<T>>,
}
unsafe impl<T: Copy + Send> Sync for CellDataset<T> {}
impl<T: Copy> CellDataset<T> {
pub const fn new() -> Self {
Self {
value: Cell::new(None),
}
}
}
impl<T: Copy> Default for CellDataset<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: Copy> Dataset for CellDataset<T> {
type LoadItem = T;
type SaveItem = T;
type Error = PondError;
fn load(&self) -> Result<Self::LoadItem, PondError> {
self.value.get().ok_or(PondError::DatasetNotLoaded)
}
fn save(&self, output: Self::SaveItem) -> Result<(), PondError> {
self.value.set(Some(output));
Ok(())
}
}
impl<T: Copy> Serialize for CellDataset<T> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_unit()
}
}