Restores a sequence of string definitions using the first entry as the
    original and then applying a series of :func:`~acorn.logging.diff.restore`
    calls.

    Args:
        sequence (list): of results returned by
          :func:`~acorn.logging.diff.compress`, except that the first entry should
          be a list of string entries for the very first instance.
        full (bool): when True, return all the intermediate entries as well;
          otherwise they are not stored in memory and only the final entry in
          the list is returned.

def cascade(sequence, full=False):
    """Restores a sequence of string definitions using the first entry as the
    original and then applying a series of :func:`~acorn.logging.diff.restore`
    calls.

    Args:
        sequence (list): of results returned by
          :func:`~acorn.logging.diff.compress`, except that the first entry should
          be a list of string entries for the very first instance.
        full (bool): when True, return all the intermediate entries as well;
          otherwise they are not stored in memory and only the final entry in
          the list is returned.
    """
    if len(sequence) == 1:
        return sequence[0]
    
    left = sequence[0]
    if full:
        intermed = []
    for cdiff in sequence[1:]:
        right = restore(cdiff, left)
        if full:
            intermed.append(right)
        left = right

    return left