struct Constraints(Map[Var, Subtype])
pub fn Constraints::empty() -> Constraints {
Constraints(Map([]))
}
fn Constraints::items(self : Constraints) -> Map[Var, Subtype] {
let Constraints(items) = self
items
}
pub fn Constraints::meet(
self : Constraints,
other : Constraints,
) -> Constraints {
Constraints(
union_with(self.items(), other.items(), (l, r) => {
let { l: l1, r: r1 } = l
let { l: l2, r: r2 } = r
{ l: l1 & l2, r: r1 | r2 }
}),
)
}
pub fn meets(c : Array[Constraints]) -> Constraints {
c.iter().fold(init=Constraints::empty(), Constraints::meet)
}