code: def next_pos_with_sort_not_in(self, address, sorts, max_distance=None):
          
  
          list_length = len(self._list)
  
          idx = self._search(address)
          if idx < list_length:
              # Occupied
              block = self._list[idx]
  
              if max_distance is not None and address + max_distance < block.start:
                  return None
  
              if block.start <= address < block.end:
                  # the address is inside the current block
                  if block.sort not in sorts:
                      return address
                  # tick the idx forward by 1
                  idx += 1
  
              i = idx
              while i < list_length:
                  if max_distance is not None and address + max_distance < self._list[i].start:
                      return None
                  if self._list[i].sort not in sorts:
                      return self._list[i].start
                  i += 1
  
          return None
docs: Returns the address of the next occupied block whose sort is not one of the specified ones.
  
          :param int address: The address to begin the search with (including itself).
          :param sorts:       A collection of sort strings.
          :param max_distance:    The maximum distance between `address` and the next position. Search will stop after
                                  we come across an occupied position that is beyond `address` + max_distance. This check
                                  will be disabled if `max_distance` is set to None.
          :return:            The next occupied position whose sort is not one of the specified ones, or None if no such
                              position exists.
          :rtype:             int or None