code: def get_2D_overlap(chain, eclusters):
      
      mergeables = Grouper()
      active = set()
  
      x_ends = []
      for i, (range_x, range_y, score) in enumerate(eclusters):
          chr, left, right = range_x
          x_ends.append((chr, left, 0, i))  # 0/1 for left/right-ness
          x_ends.append((chr, right, 1, i))
      x_ends.sort()
  
      chr_last = ""
      for chr, pos, left_right, i in x_ends:
          if chr != chr_last:
              active.clear()
          if left_right == 0:
              active.add(i)
              for x in active:
                  # check y-overlap
                  if range_overlap(eclusters[x][1], eclusters[i][1]):
                      mergeables.join(x, i)
          else:  # right end
              active.remove(i)
  
          chr_last = chr
  
      return mergeables
docs: Implements a sweep line algorithm, that has better running time than naive O(n^2):
      assume block has x_ends, and y_ends for the bounds
  
      1. sort x_ends, and take a sweep line to scan the x_ends
      2. if left end, test y-axis intersection of current block with `active` set;
         also put this block in the `active` set
      3. if right end, remove block from the `active` set