def advance_day(day_finish, day_list, done_day_lists, finish_of):
    """Ends the current day and sets things up ready to process the next day.

    Args:
        day_finish: The aware local datetime of the end of the day that is about
            to finish (and, thus, also the start of the next day)
        day_list: The completed list of timeslots for the day being finished.
        done_day_lists: the list of completed day lists (in chronological
            order) to push the new day onto
        finish_of: A function taking a timeslot and returning its finish
            as a local aware datetime.
    Returns:
        The initial list for the new day, which may or may not be empty
        depending on show day crossover.
    """
    # We should NEVER be storing an empty list, as every day should at least
    # have one show (the filler show).
    if not day_list:
        raise ValueError(
            'split_days encountered empty day list, is filler working? '
            '(day_finish={} day_list={} done_day_lists={})'.format(
                day_finish,
                day_list,
                done_day_lists
            )
        )

    done_day_lists.append(day_list)

    # We need to see if the last show we processed straddles the boundary
    # between the two days and, if so, make sure it appears at the start of the
    # new list too.
    last_show = day_list[-1]
    return [last_show] if finish_of(last_show) > day_finish else []