///|
fn solve_equations() -> Unit raise {
  let solver = @cassowary.Solver::new()
  let x = @cassowary.Variable::new("x")
  let y = @cassowary.Variable::new("y")
  let sum = @cassowary.Constraint::new(
    @cassowary.Expression::new([(x, 1.0), (y, 1.0)], constant=-10.0),
    @cassowary.Relation::Equal,
  )
  let difference = @cassowary.Constraint::new(
    @cassowary.Expression::new([(x, 1.0), (y, -1.0)], constant=-4.0),
    @cassowary.Relation::Equal,
  )
  solver.add_constraint(sum)
  solver.add_constraint(difference)
  assert_true(solver.value(x) > 6.999999 && solver.value(x) < 7.000001)
  assert_true(solver.value(y) > 2.999999 && solver.value(y) < 3.000001)
  assert_true(sum.violation(solver) < 0.000001)
  assert_true(difference.violation(solver) < 0.000001)
  println("x + y = 10; x - y = 4")
  println("Solved: x=\{solver.value(x)}, y=\{solver.value(y)}")
  println(
    "Residuals: sum=\{sum.violation(solver)}, difference=\{difference.violation(solver)}",
  )
  println("Pivots: \{solver.statistics().pivots}")
}

///|
fn main {
  solve_equations() catch {
    error => {
      println("equations failed: \{error}")
      panic()
    }
  }
}