code: def __match_rows(self, optimized_lines=None, transpose=False):
          
          MIN_LENGTH = 3
          a = self._array
          if transpose:
              a = a.T
          rows = optimized_lines or range(8)
          # check for matches in each row separately
          for row in rows:
              NUM_COLUMNS = 8
              match_length = 1
              start_position = 0  # next tile pointer
              #set next start position as long as a match is still possible
              while start_position + MIN_LENGTH <= NUM_COLUMNS:
                  group_type = a[row, start_position]
                  # try to increase match length as long as there is room
                  while start_position + match_length + 1 <= NUM_COLUMNS:
                      next_tile = a[row, start_position + match_length]
                      # if no match, stop looking for further matches
                      if not group_type.matches(next_tile):
                          break
                      # if group_type is wildcard, try to find a real type
                      if group_type.is_wildcard():
                          group_type = next_tile
                      match_length += 1
                  #produce a matched position group if the current match qualifies
                  if match_length >= MIN_LENGTH and not group_type.is_wildcard():
                      row_ = row
                      target_positions = [(row_, col_) for col_
                                          in range(start_position,
                                                   start_position + match_length)]
                      if transpose:
                          target_positions = [(col_, row_)
                                              for row_, col_ in target_positions]
                      yield target_positions
                  #setup for continuing to look for matches after the current one
                  start_position += match_length
                  match_length = 1
docs: Main functionality of _match, but works only on rows.
          Full matches are found by running this once with original board and
          once with a transposed board.
  
          Arguments:
          optimized_lines is an optional argument that identifies the lines
          that need to be matched.
  
          transpose indicates whether the match is looking at rows or columns