1use std::{fmt::Debug, hash::Hash, sync::Arc};
2
3use crate::{
4 binder::CoreBinder,
5 cast::{DowncastFrom, Upcast},
6 collections::Set,
7 fold::CoreFold,
8 language::Language,
9 parse::CoreParse,
10};
11
12pub trait CoreTerm<L: Language>:
13 Clone
14 + CoreFold<L>
15 + CoreParse<L>
16 + Ord
17 + Eq
18 + Hash
19 + Debug
20 + Upcast<Self>
21 + DowncastFrom<Self>
22 + 'static
23 + Sized
24{
25}
26
27impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Vec<T> {}
28
29impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Set<T> {}
30
31impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Option<T> {}
32
33impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for Arc<T> {}
34
35impl<L: Language> CoreTerm<L> for usize {}
36
37impl<L: Language> CoreTerm<L> for u32 {}
38
39impl<L: Language, A: CoreTerm<L>, B: CoreTerm<L>> CoreTerm<L> for (A, B) {}
40
41impl<L: Language, T: CoreTerm<L>> CoreTerm<L> for CoreBinder<L, T> {}
42
43impl<L: Language> CoreTerm<L> for () {}