docs: private void clinkstep4567(DBIDRef id, ArrayDBIDs ids, DBIDArrayIter it, int n, WritableDBIDDataStore pi, WritableDoubleDataStore lambda, WritableDoubleDataStore m) {
      // step 4: a = n
      DBIDArrayIter a = ids.iter().seek(n - 1);
      // step 5:
      {
        DBIDVar p_i = DBIDUtil.newVar();
        for(it.seek(n - 1); it.valid(); it.retract()) {
          double l_i = lambda.doubleValue(it);
          double mp_i = m.doubleValue(p_i.from(pi, it));
          if(l_i >= mp_i) {
            if(m.doubleValue(it) < m.doubleValue(a)) {
              a.seek(it.getOffset());
            }
          }
          else {
            m.putDouble(it, Double.POSITIVE_INFINITY);
          }
        }
      }
  
      // step 6
      DBIDVar b = DBIDUtil.newVar().from(pi, a); // b = pi[a]
      double c = lambda.doubleValue(a);
      pi.putDBID(a, id);
      lambda.putDouble(a, m.doubleValue(a));
  
      // step 7
      if(a.getOffset() < n - 1) {
        DBIDRef last = DBIDUtil.newVar(it.seek(n - 1)); // Used below
        DBIDVar d = DBIDUtil.newVar();
        // if b < n: (then goto 7)
        while(!DBIDUtil.equal(b, id)) {
          if(DBIDUtil.equal(b, last)) {
            pi.putDBID(b, id);
            lambda.putDouble(b, c);
            break;
          }
          d.from(pi, b); // d = pi[b]
          pi.putDBID(b, id); // pi[b] = n + 1
          c = lambda.putDouble(b, c); // c = old l[b], l[b] = c
          b.set(d); // b = d = old pi[b]
        }
      }
    }