///|
// Bound decoded output before materialization; repeated references can expand tiny inputs.
fn check_expansion(data : Json) -> Unit raise TopoError {
  let arcs = array(field(data, "arcs"))
  let mut expanded = 0
  let mut refs = 0
  for g in array_objects(data) {
    for r in geometry_refs(g) {
      refs += 1
      expanded += array(arcs[arc_id(r)]).length()
      if refs > 100000 || expanded > 2000000 {
        raise Invalid("limit.expansion")
      }
    }
  }
}

///|
fn array_objects(data : Json) -> Array[Json] {
  match field(data, "objects") {
    Object(m) => m.values().collect()
    _ => []
  }
}