iterUnion = xyi => {
  const result = [];
  for (const [m, xc, yc] of xyi) {
    if (xc >= 0n) {
      result.push(m);
    } else {
      yc >= 0n || Fail`Internal: Unexpected count ${q(yc)}`;
      // if x and y were both ready, then they were equivalent and
      // above clause already took care of it. Otherwise push here.
      result.push(m);
    }
  }
  return result;
}
@template T
@param {Iterable<[T,bigint,bigint]>} xyi
@returns {T[]}