docs: def srotate(self):
          """Single rotation. Assumes that balance is +-2."""
          #     self        save         save
          #   save 3  ->   1   self  -> 1   self.rot()
          #  1   2            2   3
          #
          #  self            save                save
          # 3   save  ->  self  1    -> self.rot()   1
          #    2   1     3   2
  
          #assert(self.balance != 0)
          heavy = self.balance > 0
          light = not heavy
          save = self[heavy]
          #print("srotate: bal={},{}".format(self.balance, save.balance))
          #self.print_structure()
          self[heavy] = save[light]   # 2
          #assert(save[light])
          save[light] = self.rotate()  # Needed to ensure the 2 and 3 are balanced under new subnode
  
          # Some intervals may overlap both self.x_center and save.x_center
          # Promote those to the new tip of the tree
          promotees = [iv for iv in save[light].s_center if save.center_hit(iv)]
          if promotees:
              for iv in promotees:
                  save[light] = save[light].remove(iv)  # may trigger pruning
              # TODO: Use Node.add() here, to simplify future balancing improvements.
              # For now, this is the same as augmenting save.s_center, but that may
              # change.
              save.s_center.update(promotees)
          save.refresh_balance()
          return save