Returns whether the value has a mixture channel representation.

    In contrast to `has_mixture` this method falls back to checking whether
    the value has a unitary representation via `has_channel`.

    Returns:
        If `val` has a `_has_mixture_` method and its result is not
        NotImplemented, that result is returned. Otherwise, if `val` has a
        `_has_unitary_` method and its results is not NotImplemented, that
        result is returned. Otherwise, if the value has a `_mixture_` method
        that is not a non-default value, True is returned. Returns False if none
        of these functions.

def has_mixture_channel(val: Any) -> bool:
    """Returns whether the value has a mixture channel representation.

    In contrast to `has_mixture` this method falls back to checking whether
    the value has a unitary representation via `has_channel`.

    Returns:
        If `val` has a `_has_mixture_` method and its result is not
        NotImplemented, that result is returned. Otherwise, if `val` has a
        `_has_unitary_` method and its results is not NotImplemented, that
        result is returned. Otherwise, if the value has a `_mixture_` method
        that is not a non-default value, True is returned. Returns False if none
        of these functions.
    """
    mixture_getter = getattr(val, '_has_mixture_', None)
    result = NotImplemented if mixture_getter is None else mixture_getter()
    if result is not NotImplemented:
        return result

    result = has_unitary(val)
    if result is not NotImplemented and result:
        return result

    # No _has_mixture_ or _has_unitary_ function, use _mixture_ instead.
    return mixture_channel(val, None) is not None