def zip_until_right(*iterables):
    """
    A zip function that validates that the right iterable is consumed.

    Args:
        *iterables: the iterables to pass to `zip`.

    Yields:
        each zipped element.

    Raises:
        ValueError: if the left iterable is consumed before the right.
    """
    lefts = iterables[:-1]
    right = iter(iterables[-1])
    iterables = lefts + (right,)
    for item in zip(*iterables):
        yield item
    try:
        next(right)
        raise ValueError('the right-most iterable was not consumed')
    except StopIteration:
        pass
