use std::{fmt::Debug, hash::Hash, sync::Arc};
use crate::{
binder::CoreBinder,
cast::{DowncastFrom, Upcast},
collections::Set,
fold::CoreFold,
language::Language,
parse::CoreParse,
};
pub trait CoreTerm<L: Language>:
Clone
+ CoreFold<L>
+ CoreParse<L>
+ Ord
+ Eq
+ Hash
+ Debug
+ Upcast<Self>
+ DowncastFrom<Self>
+ 'static
+ Sized
{
}
impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Vec<T> {}
impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Set<T> {}
impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Option<T> {}
impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Arc<T> {}
impl<L: Language> CoreTerm<L> for usize {}
impl<L: Language> CoreTerm<L> for u32 {}
impl<L: Language, A: CoreTerm<L>, B: CoreTerm<L>> CoreTerm<L> for (A, B) {}
impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for CoreBinder<L, T> {}
impl<L: Language> CoreTerm<L> for () {}