use std::hash::Hash;
use sophia_api::term::TTerm;
use sophia_term::*;
pub mod reexport {
pub use sophia_api::dataset::MdResult;
pub use sophia_api::quad::stream::{QuadSource, StreamResult};
pub use sophia_api::quad::Quad;
}
pub trait IndexedDataset {
type Index: Copy + Eq + Hash;
type TermData: TermData + 'static;
fn with_capacity(capacity: usize) -> Self;
fn shrink_to_fit(&mut self);
fn get_index<T>(&self, t: &T) -> Option<Self::Index>
where
T: TTerm + ?Sized;
fn get_index_for_graph_name<T>(&self, g: Option<&T>) -> Option<Self::Index>
where
T: TTerm + ?Sized;
fn get_term(&self, i: Self::Index) -> Option<&Term<Self::TermData>>;
#[allow(clippy::option_option)]
fn get_graph_name(&self, i: Self::Index) -> Option<Option<&Term<Self::TermData>>>;
fn insert_indexed<TS, TP, TO, TG>(
&mut self,
s: &TS,
p: &TP,
o: &TO,
g: Option<&TG>,
) -> Option<[Self::Index; 4]>
where
TS: TTerm + ?Sized,
TP: TTerm + ?Sized,
TO: TTerm + ?Sized,
TG: TTerm + ?Sized;
fn remove_indexed<TS, TP, TO, TG>(
&mut self,
s: &TS,
p: &TP,
o: &TO,
g: Option<&TG>,
) -> Option<[Self::Index; 4]>
where
TS: TTerm + ?Sized,
TP: TTerm + ?Sized,
TO: TTerm + ?Sized,
TG: TTerm + ?Sized;
}
#[macro_export]
macro_rules! impl_collectible_dataset_for_indexed_dataset {
($indexed_mutable_dataset: ty) => {
impl CollectibleDataset for $indexed_mutable_dataset {
impl_collectible_dataset_for_indexed_dataset!();
}
};
() => {
fn from_quad_source<QS: $crate::dataset::reexport::QuadSource>(
mut quads: QS,
) -> $crate::dataset::reexport::StreamResult<Self, QS::Error, Self::Error> {
use $crate::dataset::reexport::Quad;
let (tmin, tmax) = quads.size_hint_quads();
let cap = tmax.unwrap_or(tmin);
let mut g = Self::with_capacity(cap);
quads
.try_for_each_quad(|q| -> Result<(), Self::Error> {
g.insert_indexed(q.s(), q.p(), q.o(), q.g());
Ok(())
})
.map(|_| g)
}
};
}
#[macro_export]
macro_rules! impl_mutable_dataset_for_indexed_dataset {
($indexed_mutable_dataset: ty) => {
impl MutableDataset for $indexed_mutable_dataset {
impl_mutable_dataset_for_indexed_dataset!();
}
};
() => {
type MutationError = std::convert::Infallible;
fn insert<TS_, TP_, TO_, TG_>(
&mut self,
s: &TS_,
p: &TP_,
o: &TO_,
g: Option<&TG_>,
) -> $crate::dataset::reexport::MdResult<Self, bool>
where
TS_: sophia_api::term::TTerm + ?Sized,
TP_: sophia_api::term::TTerm + ?Sized,
TO_: sophia_api::term::TTerm + ?Sized,
TG_: sophia_api::term::TTerm + ?Sized,
{
Ok(self.insert_indexed(s, p, o, g).is_some())
}
fn remove<TS_, TP_, TO_, TG_>(
&mut self,
s: &TS_,
p: &TP_,
o: &TO_,
g: Option<&TG_>,
) -> $crate::dataset::reexport::MdResult<Self, bool>
where
TS_: sophia_api::term::TTerm + ?Sized,
TP_: sophia_api::term::TTerm + ?Sized,
TO_: sophia_api::term::TTerm + ?Sized,
TG_: sophia_api::term::TTerm + ?Sized,
{
Ok(self.remove_indexed(s, p, o, g).is_some())
}
};
}
#[cfg(test)]
mod test {
}