use interface;
use interface::Term;
use print::ATermWrite;
use std::fmt;
use std::rc::Rc;
use std::marker::PhantomData;
pub mod shared;
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub struct ATerm<B>(interface::ATermInner<Rc<ATerm<B>>, B>);
impl<B> ATerm<B> {
pub fn no_annos(term: Term<Rc<ATerm<B>>, B>) -> Self {
ATerm(interface::ATermInner::no_annos(term))
}
pub fn with_annos<A>(term: Term<Rc<ATerm<B>>, B>, annos: A) -> Self
where A: IntoIterator<Item = Rc<ATerm<B>>>
{
ATerm(interface::ATermInner::with_annos(term, annos))
}
}
impl<B> interface::ATerm for ATerm<B> {
type Rec = Rc<ATerm<B>>;
type Blob = B;
#[inline]
fn into_inner(self) -> interface::ATermInner<Rc<ATerm<B>>, B> {
self.0
}
#[inline]
fn as_inner(&self) -> &interface::ATermInner<Rc<ATerm<B>>, B> {
&self.0
}
}
impl<B> fmt::Display for ATerm<B>
where B: ATermWrite
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.to_ascii(f)
}
}
impl<'a, B: 'a + ATermWrite> ATermWrite for ATerm<B> {
#[inline]
fn to_ascii<W: fmt::Write>(&self, writer: &mut W) -> fmt::Result {
self.0.to_ascii(writer)
}
#[inline]
fn to_taf<W: fmt::Write>(&self, writer: &mut W) -> fmt::Result {
self.0.to_taf(writer)
}
#[inline]
fn to_baf<W: fmt::Write>(&self, writer: &mut W) -> fmt::Result {
self.0.to_baf(writer)
}
#[inline]
fn to_saf<W: fmt::Write>(&self, writer: &mut W) -> fmt::Result {
self.0.to_saf(writer)
}
}
#[derive(Default, Debug)]
pub struct ATermFactory<B> {
_nothing: PhantomData<ATerm<B>>,
}
impl<B> ATermFactory<B> {
pub fn new() -> Self {
ATermFactory { _nothing: PhantomData }
}
}
impl<B: Clone> interface::ATermFactory<B> for ATermFactory<B> {
type ATerm = ATerm<B>;
type ATermRef = Rc<ATerm<B>>;
fn no_annos(&self, term: Term<Rc<ATerm<B>>, B>) -> Self::ATermRef {
Rc::new(ATerm::no_annos(term))
}
fn with_annos<A>(&self, term: Term<Rc<ATerm<B>>, B>, annos: A) -> Self::ATermRef
where A: IntoIterator<Item = Self::ATermRef>
{
Rc::new(ATerm::with_annos(term, annos))
}
}