docs: def concatenate_node_predicates(node_predicates: NodePredicates) -> NodePredicate:
      """Concatenate multiple node predicates to a new predicate that requires all predicates to be met.
  
      Example usage:
  
      >>> from pybel.dsl import protein, gene
      >>> from pybel.struct.filters.node_predicates import not_pathology, node_exclusion_predicate_builder
      >>> app_protein = protein(name='APP', namespace='HGNC')
      >>> app_gene = gene(name='APP', namespace='HGNC')
      >>> app_predicate = node_exclusion_predicate_builder([app_protein, app_gene])
      >>> my_predicate = concatenate_node_predicates([not_pathology, app_predicate])
      """
      # If a predicate outside a list is given, just return it
      if not isinstance(node_predicates, Iterable):
          return node_predicates
  
      node_predicates = tuple(node_predicates)
  
      # If only one predicate is given, don't bother wrapping it
      if 1 == len(node_predicates):
          return node_predicates[0]
  
      def concatenated_node_predicate(graph: BELGraph, node: BaseEntity) -> bool:
          """Pass only for a nodes that pass all enclosed predicates."""
          return all(
              node_predicate(graph, node)
              for node_predicate in node_predicates
          )
  
      return concatenated_node_predicate