use crate::core::{ReadyState, Reify, State, Unify, Value};
use std::rc::Rc;
#[macro_export]
macro_rules! ltup {
($($item:expr),* $(,)?) => {
($($crate::core::Value::from($item)),*)
};
}
#[doc(inline)]
pub use ltup;
macro_rules! impl_unify_tuple {
($($t:ident => $r:ident),+) => {
impl<$($t,)*> Unify for ($(Value<$t>),*)
where
$($t: Unify, )*
{
fn unify(
state: State,
l: Rc<Self>,
r: Rc<Self>,
) -> Option<State> {
#![allow(non_snake_case)]
#![allow(clippy::needless_question_mark)]
let ($($t),*) = l.as_ref();
let ($($r),*) = r.as_ref();
Some(state$(.unify($t, $r)?)*)
}
}
};
}
impl_unify_tuple!(Av => Ar, Bv => Br);
impl_unify_tuple!(Av => Ar, Bv => Br, Cv => Cr);
impl_unify_tuple!(Av => Ar, Bv => Br, Cv => Cr, Dv => Dr);
impl_unify_tuple!(Av => Ar, Bv => Br, Cv => Cr, Dv => Dr, Ev => Er);
macro_rules! impl_reify_tuple {
($($t:ident => $r:ident),+) => {
impl<$($t: Reify< Reified = $r>, $r,)*> Reify for ($($t),*) {
type Reified = ($($t::Reified),*);
fn reify_in(&self, state: &ReadyState) -> Option<Self::Reified> {
#![allow(non_snake_case)]
let ($($t),*) = self;
Some(($($t.reify_in(state)?),*))
}
}
};
}
impl_reify_tuple!(Av => Ar, Bv => Br);
impl_reify_tuple!(Av => Ar, Bv => Br, Cv => Cr);
impl_reify_tuple!(Av => Ar, Bv => Br, Cv => Cr, Dv => Dr);
impl_reify_tuple!(Av => Ar, Bv => Br, Cv => Cr, Dv => Dr, Ev => Er);