use std::collections::BTreeSet;
use typeck::subst::SubstVar;
#[derive(Clone, Debug, DisplayAttr, Eq, PartialEq, Ord, PartialOrd)]
pub enum Ty {
#[display(fmt = "bool")]
Bool,
#[display(fmt = "({} -> {})", _0, _1)]
Func(Box<Ty>, Box<Ty>),
#[display(fmt = "int")]
Int,
#[display(fmt = "({} list)", _0)]
List(Box<Ty>),
#[display(fmt = "{}", _0)]
Var(SubstVar),
}
impl Ty {
pub fn fresh() -> Ty {
Ty::Var(SubstVar::fresh())
}
pub fn freevars(&self) -> BTreeSet<SubstVar> {
match *self {
Ty::Bool | Ty::Int => BTreeSet::new(),
Ty::Func(ref l, ref r) => l.freevars().into_iter().chain(r.freevars()).collect(),
Ty::List(ref t) => t.freevars(),
Ty::Var(v) => {
let mut s = BTreeSet::new();
s.insert(v);
s
}
}
}
}