docs: def parse_signature(signature):
      """Parse a signature into its input and return parameter types.
  
      This will also collect the types that are required by any of the input
      and return types.
  
      :sig: (str) -> Tuple[List[str], str, Set[str]]
      :param signature: Signature to parse.
      :return: Input parameter types, return type, and all required types.
      """
      if " -> " not in signature:
          # signature comment: no parameters, treat variable type as return type
          param_types, return_type = None, signature.strip()
      else:
          lhs, return_type = [s.strip() for s in signature.split(" -> ")]
          csv = lhs[1:-1].strip()  # remove the parentheses around the parameter type list
          param_types = split_parameter_types(csv)
      requires = set(_RE_QUALIFIED_TYPES.findall(signature))
      return param_types, return_type, requires