aterm 0.13.0

Implementation of the Annotated Terms data structure
Documentation
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))
    }
}