def get_next(intersection, intersections, unused):
    """Gets the next node along a given edge.

    .. note::

       This is a helper used only by :func:`basic_interior_combine`, which in
       turn is only used by :func:`combine_intersections`. This function does
       the majority of the heavy lifting for :func:`basic_interior_combine`.

    .. note::

        This function returns :class:`.Intersection` objects even
        when the point isn't strictly an intersection. This is
        "incorrect" in some sense, but for now, we don't bother
        implementing a class similar to, but different from,
        :class:`.Intersection` to satisfy this need.

    Args:
        intersection (.Intersection): The current intersection.
        intersections (List[.Intersection]): List of all detected
            intersections, provided as a reference for potential
            points to arrive at.
        unused (List[.Intersection]): List of nodes that haven't been
            used yet in an intersection curved polygon

    Returns:
        .Intersection: The "next" point along a surface of intersection.
        This will produce the next intersection along the current edge or
        the end of the current edge.

    Raises:
        ValueError: If the intersection is not classified as
            :attr:`~.IntersectionClassification.FIRST`,
            :attr:`~.IntersectionClassification.TANGENT_FIRST`,
            :attr:`~.IntersectionClassification.SECOND`,
            :attr:`~.IntersectionClassification.TANGENT_SECOND` or
            :attr:`~.IntersectionClassification.COINCIDENT`.
    """
    result = None
    if is_first(intersection.interior_curve):
        result = get_next_first(intersection, intersections)
    elif is_second(intersection.interior_curve):
        result = get_next_second(intersection, intersections)
    elif intersection.interior_curve == CLASSIFICATION_T.COINCIDENT:
        result = get_next_coincident(intersection, intersections)
    else:
        raise ValueError(
            'Cannot get next node if not starting from "FIRST", '
            '"TANGENT_FIRST", "SECOND", "TANGENT_SECOND" or "COINCIDENT".'
        )

    if result in unused:
        unused.remove(result)
    return result