from typing import Optional


def find_spike(values: list[float], threshold: float) -> Optional[tuple[int, float]]:
    """ Returns the index and value of the first gradient that is greater than
     or equal to the given threshold. If no such gradient exists, returns None.

    Args:
        values: A list of entropy-gradient values.
        threshold: A threshold to check against

    Returns:
        If a valid value exists, a 2-tuple of index and value, otherwise None.
    """
    spikes = filter(
        lambda index_gradient: index_gradient[1] >= threshold,
        (v for v in enumerate(values)),
    )
    return next(spikes, None)