///|
pub(all) struct ParetoResult {
  fronts : Array[Array[String]]
  front_indices : Array[Int32]
  dominated_by : Array[Array[Int32]]
} derive(@debug.Debug)

///|
fn dominates(m : DecisionMatrix, a : Int32, b : Int32) -> Bool {
  let mut strictly = false
  for j in 0.. y {
        strictly = true
      }
    } else {
      if x > y {
        return false
      }
      if x < y {
        strictly = true
      }
    }
  }
  strictly
}

///|
/// Exact dominance, intentionally without tolerance that could break transitivity.
pub fn pareto_fronts(m : DecisionMatrix) -> ParetoResult {
  let n = m.names.length()
  let dominated_by : Array[Array[Int32]] = [ for _ in 0.. [] ]
  let successors : Array[Array[Int32]] = [ for _ in 0.. [] ]
  for a in 0.. row.length())
  let front_indices = Array::make(n, -1)
  let fronts : Array[Array[String]] = []
  let mut current = [ for i in 0.. i ]
  while current.length() > 0 {
    let index = fronts.length()
    fronts.push(current.map(i => m.names[i]))
    for i in current {
      front_indices[i] = index
    }
    for i in current {
      for k in successors[i] {
        remaining[k] -= 1
      }
    }
    current = [
      for i in 0.. i
    ]
  }
  { fronts, front_indices, dominated_by, }
}

///|
pub extend ParetoResult with @debug.Debug::{to_repr}