use std::rc;
use std::sync;
use weak_table::WeakHashSet;
use super::*;
pub type FTerm<F> = Term<<F as TermFactory>::TermData>;
pub trait TermFactory {
type TermData: TermData + for<'x> From<&'x str>;
fn get_term_data<T>(&mut self, txt: T) -> Self::TermData
where
T: TermData + Into<Self::TermData>;
fn iri<T>(&mut self, iri: T) -> Result<FTerm<Self>>
where
T: TermData + Into<Self::TermData>,
{
Term::new_iri(self.get_term_data(iri))
}
fn iri2<T, U>(&mut self, ns: T, suffix: U) -> Result<FTerm<Self>>
where
T: TermData + Into<Self::TermData>,
U: TermData + Into<Self::TermData>,
{
Term::new_iri_suffixed(self.get_term_data(ns), self.get_term_data(suffix))
}
fn bnode<T>(&mut self, id: T) -> Result<FTerm<Self>>
where
T: TermData + Into<Self::TermData>,
{
Term::new_bnode(self.get_term_data(id))
}
fn literal_lang<T, U>(&mut self, txt: T, lang: U) -> Result<FTerm<Self>>
where
T: TermData + Into<Self::TermData>,
U: TermData + Into<Self::TermData>,
{
Term::new_literal_lang(self.get_term_data(txt), self.get_term_data(lang))
}
fn literal_dt<T, U>(&mut self, txt: T, dt: Term<U>) -> Result<FTerm<Self>>
where
T: TermData + Into<Self::TermData>,
U: TermData + Into<Self::TermData>,
{
Term::new_literal_dt(self.get_term_data(txt), self.convert_term(dt))
}
fn variable<T>(&mut self, name: T) -> Result<FTerm<Self>>
where
T: TermData + Into<Self::TermData>,
{
Term::new_variable(self.get_term_data(name))
}
fn convert_term<T>(&mut self, other: Term<T>) -> FTerm<Self>
where
T: TermData + Into<Self::TermData>,
{
other.map(|txt| self.get_term_data(txt))
}
fn clone_term<T>(&mut self, other: &T) -> FTerm<Self>
where
T: TTerm + ?Sized,
{
RefTerm::from(other).clone_map(|txt| self.get_term_data(txt.as_ref()))
}
fn shrink_to_fit(&mut self);
}
pub type RcTermFactory = WeakHashSet<rc::Weak<str>>;
impl TermFactory for RcTermFactory {
type TermData = Rc<str>;
fn get_term_data<T>(&mut self, txt: T) -> Rc<str>
where
T: TermData + Into<Rc<str>>,
{
if let Some(term_data) = self.get(txt.as_ref()) {
term_data
} else {
let term_data = Into::<Rc<str>>::into(txt);
self.insert(Rc::clone(&term_data));
term_data
}
}
fn shrink_to_fit(&mut self) {
WeakHashSet::shrink_to_fit(self);
}
}
pub type ArcTermFactory = WeakHashSet<sync::Weak<str>>;
impl TermFactory for ArcTermFactory {
type TermData = sync::Arc<str>;
fn get_term_data<T>(&mut self, txt: T) -> sync::Arc<str>
where
T: TermData + Into<sync::Arc<str>>,
{
if let Some(term_data) = self.get(txt.as_ref()) {
term_data
} else {
let term_data = Into::<sync::Arc<str>>::into(txt);
self.insert(sync::Arc::clone(&term_data));
term_data
}
}
fn shrink_to_fit(&mut self) {
WeakHashSet::shrink_to_fit(self);
}
}
#[cfg(test)]
mod test {
}