def single_link(first_clustering, second_clustering, distance_function):
    """
    Finds the smallest distance between any two points in the two given clusters

    :param first_clustering: a set of points
    :param second_clustering: a set of points
    :param distance_function: a function that compares two points

    :return: the smallest distance between a pair of points in the two clusters
    """
    min_neighbor_distance = None
    for first_neighbor in first_clustering:
        for second_neighbor in second_clustering:
            current_distance = distance_function(first_neighbor, second_neighbor)
            if not min_neighbor_distance or min_neighbor_distance > current_distance:
                min_neighbor_distance = current_distance
    return min_neighbor_distance