use std::marker::PhantomData;
use automerge::{ChangeHash, ObjId, Prop, ReadDoc, transaction::Transactable};
use crate::{Automorph, PrimitiveChanged, Result, ScalarCursor};
impl<T> Automorph for PhantomData<T> {
type Changes = PrimitiveChanged;
type Cursor = ScalarCursor;
fn save<D: Transactable + ReadDoc>(
&self,
doc: &mut D,
obj: impl AsRef<ObjId>,
prop: impl Into<Prop>,
) -> Result<()> {
().save(doc, obj, prop)
}
fn load<D: ReadDoc>(doc: &D, obj: impl AsRef<ObjId>, prop: impl Into<Prop>) -> Result<Self> {
<()>::load(doc, obj, prop)?;
Ok(PhantomData)
}
fn load_at<D: ReadDoc>(
doc: &D,
obj: impl AsRef<ObjId>,
prop: impl Into<Prop>,
heads: &[ChangeHash],
) -> Result<Self> {
<()>::load_at(doc, obj, prop, heads)?;
Ok(PhantomData)
}
fn diff<D: ReadDoc>(
&self,
doc: &D,
obj: impl AsRef<ObjId>,
prop: impl Into<Prop>,
) -> Result<Self::Changes> {
().diff(doc, obj, prop)
}
fn diff_at<D: ReadDoc>(
&self,
doc: &D,
obj: impl AsRef<ObjId>,
prop: impl Into<Prop>,
heads: &[ChangeHash],
) -> Result<Self::Changes> {
().diff_at(doc, obj, prop, heads)
}
fn update<D: ReadDoc>(
&mut self,
doc: &D,
obj: impl AsRef<ObjId>,
prop: impl Into<Prop>,
) -> Result<Self::Changes> {
().diff(doc, obj, prop)
}
fn update_at<D: ReadDoc>(
&mut self,
doc: &D,
obj: impl AsRef<ObjId>,
prop: impl Into<Prop>,
heads: &[ChangeHash],
) -> Result<Self::Changes> {
().diff_at(doc, obj, prop, heads)
}
}
#[cfg(test)]
mod tests {
use super::*;
use automerge::{AutoCommit, ROOT};
#[test]
fn test_phantom_data() {
let mut doc = AutoCommit::new();
let phantom: PhantomData<String> = PhantomData;
phantom.save(&mut doc, &ROOT, "phantom").unwrap();
let restored: PhantomData<String> = PhantomData::load(&doc, &ROOT, "phantom").unwrap();
assert_eq!(restored, PhantomData);
}
}