ekege-macros 0.1.0

Procedural macros for Ekege: An E-graph library that's built like a database
Documentation
use quote::{quote, ToTokens, TokenStreamExt};
use syn::{
    parse::{Parse, ParseStream},
    Token,
};

use crate::{
    rewrite::{create_rewrite_tree_rule, TreeTermPatternInputSeries},
    rule::TreeRule,
};

pub(crate) struct Equivalence {
    forward_rule: TreeRule,
    backward_rule: TreeRule,
}

impl ToTokens for Equivalence {
    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
        let forward_rule = &self.forward_rule;
        let backward_rule = &self.backward_rule;

        tokens.append_all(quote! { [#forward_rule, #backward_rule] });
    }
}

impl Parse for Equivalence {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        let left_inputs = input.parse::<TreeTermPatternInputSeries>()?;

        let _ = input.parse::<Token![==]>()?;

        let right_inputs = input.parse::<TreeTermPatternInputSeries>()?;

        Ok(Self {
            forward_rule: create_rewrite_tree_rule(left_inputs.clone(), right_inputs.clone()),
            backward_rule: create_rewrite_tree_rule(right_inputs, left_inputs),
        })
    }
}