Multiline a singlelined frame function. Simply chains several frame
    generators together, and applies the specified offset to each one.

    Args:
        frame_function: A function that returns a singleline FrameGenerator.
        height: The amount of frame generators to stack vertically (determines
        the height in characters).
        offset: An offset to apply to each successive generator. If the offset
        is 2, then the first generator starts at frame 0, the second at frame
        2, the third at frame 4, and so on.

    Returns:
        a multiline version fo the generator returned by frame_function

def multiline_frame_function(frame_function: types.FrameFunction,
                             height: int,
                             offset: int = 0,
                             *args,
                             **kwargs) -> types.FrameGenerator:
    """Multiline a singlelined frame function. Simply chains several frame
    generators together, and applies the specified offset to each one.

    Args:
        frame_function: A function that returns a singleline FrameGenerator.
        height: The amount of frame generators to stack vertically (determines
        the height in characters).
        offset: An offset to apply to each successive generator. If the offset
        is 2, then the first generator starts at frame 0, the second at frame
        2, the third at frame 4, and so on.

    Returns:
        a multiline version fo the generator returned by frame_function
    """
    frame_generators = []
    for i in range(height):
        frame_generators.append(frame_function(*args, **kwargs))
        for _ in range(i * offset):  # advance animation
            frame_generators[i].__next__()
    frame_gen = concatechain(*frame_generators, separator='\n')
    yield from frame_gen