def default_state_progress_report(n_steps, found_states, all_states,
                                  timestep=None):
    """
    Default progress reporter for VisitAllStatesEnsemble.

    Note that it is assumed that all states have been named.

    Parameters
    ----------
    n_steps : int
        number of MD frames generated so far
    found_states : iterable
        the set of states that have been found
    all_states : iterable
        the set of all states of interest
    timestep : float or quantity
        the timestep (optional). If given, the amount of time simulated will
        be reported along with the number of MD frames.

    Returns
    -------
    str :
        formatted string with information about progress so far
    """
    report_str = "Ran {n_steps} frames"
    if timestep is not None:
        report_str += " [{}]".format(str(n_steps * timestep))
    report_str += (". Found states [{found_states}]. "
                   "Looking for [{missing_states}].\n")
    found_states_str = ",".join([s.name for s in found_states])
    # list comprehension instead of sets (to preseve order)
    missing_states = [s for s in all_states if s not in found_states]
    missing_states_str = ",".join([s.name for s in missing_states])
    return report_str.format(n_steps=n_steps,
                             found_states=found_states_str,
                             missing_states=missing_states_str)