Constraint and Constraint Set Code [blog/lti-english/cg_def_code][edit]

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)
}