code: private R pushRight(R acc, T last) {
          a = none();
          if (right == null)
              return acc;
          synchronized (root) {
              Connector<T, R> r = right;
              if (r == null)
                  return acc;
              right = null;
              r.lhs = null;
              T raleft = r.left;
              r.left = none();
              if (r.acc == NONE) {
                  if (acc == NONE) {
                      r.drain();
                  } else {
                      r.acc = acc;
                      r.right = last;
                  }
                  return none();
              }
              if (acc == NONE) {
                  return r.drainRight();
              }
              if (mergeable.test(last, raleft)) {
                  r.acc = combiner.apply(acc, r.acc);
                  return r.drainRight();
              }
              if (r.right == NONE)
                  right = new Connector<>(this, r.drain(), null);
              return acc;
          }
      }
docs: <?|acc|last> + r