use crate::{
address::{primitive::UniqueRootAddress, *},
location::Location,
};
pub trait Store: Clone {
type Error: std::fmt::Debug + std::fmt::Display + Send + Sync + 'static;
type RootAddress: Address + From<UniqueRootAddress> = UniqueRootAddress;
}
pub trait StoreEx<Root: Address + From<UniqueRootAddress>>: Store {
fn sub<Addr: Address>(&self, addr: Addr) -> Location<Addr, Self>
where
Self: Addressable<Addr>,
{
Location::new(addr, self.clone())
}
fn root(&self) -> Location<Root, Self>
where
Self: Addressable<Root>,
{
Location::new(UniqueRootAddress.into(), self.clone())
}
fn path<Addr: Address>(&self, p: &str) -> StoreResult<Location<Addr, Self>, Self>
where
Self: Addressable<Root> + Addressable<Addr>,
Root: PathAddress<Output = Addr>,
<Self as Store>::Error: From<<Root as PathAddress>::Error>, {
self.root().path(p)
}
}
impl<S: Store> StoreEx<S::RootAddress> for S {}
pub type StoreResult<V, S> = Result<V, <S as Store>::Error>;