code: def parse_list(
      parse_item: Callable[[str, int, str], Tuple[T, int]],
      header: str,
      pos: int,
      header_name: str,
  ) -> List[T]:
      
      # Per https://tools.ietf.org/html/rfc7230#section-7, "a recipient MUST
      # parse and ignore a reasonable number of empty list elements"; hence
      # while loops that remove extra delimiters.
  
      # Remove extra delimiters before the first item.
      while peek_ahead(header, pos) == ",":
          pos = parse_OWS(header, pos + 1)
  
      items = []
      while True:
          # Loop invariant: a item starts at pos in header.
          item, pos = parse_item(header, pos, header_name)
          items.append(item)
          pos = parse_OWS(header, pos)
  
          # We may have reached the end of the header.
          if pos == len(header):
              break
  
          # There must be a delimiter after each element except the last one.
          if peek_ahead(header, pos) == ",":
              pos = parse_OWS(header, pos + 1)
          else:
              raise InvalidHeaderFormat(header_name, "expected comma", header, pos)
  
          # Remove extra delimiters before the next item.
          while peek_ahead(header, pos) == ",":
              pos = parse_OWS(header, pos + 1)
  
          # We may have reached the end of the header.
          if pos == len(header):
              break
  
      # Since we only advance in the header by one character with peek_ahead()
      # or with the end position of a regex match, we can't overshoot the end.
      assert pos == len(header)
  
      return items
docs: Parse a comma-separated list from ``header`` at the given position.
  
      This is appropriate for parsing values with the following grammar:
  
          1#item
  
      ``parse_item`` parses one item.
  
      ``header`` is assumed not to start or end with whitespace.
  
      (This function is designed for parsing an entire header value and
      :func:`~websockets.http.read_headers` strips whitespace from values.)
  
      Return a list of items.
  
      Raise :exc:`~websockets.exceptions.InvalidHeaderFormat` on invalid inputs.