<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _available_cell(self) -> Tuple[int, int]: """Find next available cell first by row then column. First, construct a set containing all cells. Then iterate over the spans and remove occupied cells. """

        cells = set(itertools.product(range(len(self.rows)), range(len(self.columns))))
        for span in self._spans:
            for cell in span.cells:
                cells.remove(cell)

        if not cells:
            raise NoUnusedCellsError('No available cells')
        return min(cells)