docs: def arrange_rows(row_queue, t):
      """
      Takes a priority queue as generated by place_items_in_square().
      Arranges the items from its conceptual square to one list.  Returns
      both the resultant vector, plus the displacement vector, to be used
      in the final output hash function.
  
      >>> rows = [(2, 1, [(0, 1), (1, 5)]), (3, 3, [(1, 7)])]
      >>> result, displacements = arrange_rows(rows, 4)
      >>> result
      (1, 5, 7)
      >>> displacements
      (None, 0, None, 1)
  
      >>> rows = [(1, 1, [(0, 1), (2, 7)]), (2, 2, [(1, 5)])]
      >>> result, displacements = arrange_rows(rows, 3)
      >>> result
      (1, 5, 7)
      >>> displacements
      (None, 0, 0)
      """
  
      # Create a set of all of the unoccupied columns.
      max_columns = t ** 2
      cols = ((x, True) for x in range(max_columns))
      unoccupied_columns = collections.OrderedDict(cols)
  
      # Create the resultant and displacement vectors.
      result = [None] * max_columns
      displacements = [None] * t
  
      while row_queue:
          # Get the next row to place.
          _inverse_length, y, row = heapq.heappop(row_queue)
  
          offset = find_first_fit(unoccupied_columns, row, max_columns)
          # Calculate the offset of the first item.
          first_item_x = row[0][0]
  
          displacements[y] = offset
          for x, item in row:
              actual_x = x + offset
              result[actual_x] = item
              del unoccupied_columns[actual_x]
  
      return tuple(trim_nones_from_right(result)), tuple(displacements)