# -*- coding: utf-8 -*-
"""Predicates for checking nodes' variants."""
from functools import wraps
from typing import Tuple, Type, Union
from .utils import node_predicate
from ..typing import NodePredicate
from ....dsl import BaseEntity, CentralDogma, Fragment, GeneModification, Hgvs, ProteinModification, Variant
__all__ = [
'has_variant',
'has_protein_modification',
'has_gene_modification',
'has_fragment',
'has_hgvs',
]
[docs]@node_predicate
def has_variant(node: BaseEntity) -> bool:
"""Return true if the node has any variants."""
return isinstance(node, CentralDogma) and node.variants
def _variant_checker(variant_cls: Union[Type[Variant], Tuple[Type[Variant], ...]]) -> NodePredicate:
@node_predicate
@wraps(node_has_variant)
def _rv(node: BaseEntity):
return node_has_variant(node, variant_cls)
return _rv
def node_has_variant(node: BaseEntity, variant_cls) -> bool:
"""Return true if the node has at least one of the given variant."""
return isinstance(node, CentralDogma) and node.variants and any(
isinstance(variant, variant_cls)
for variant in node.variants
)
has_protein_modification = _variant_checker(ProteinModification)
has_gene_modification = _variant_checker(GeneModification)
has_hgvs = _variant_checker(Hgvs)
has_fragment = _variant_checker(Fragment)