def merge_components(
        *components: typing.List[typing.Union[list, tuple, COMPONENT]]
) -> COMPONENT:
    """
    Merges multiple COMPONENT instances into a single one by merging the
    lists of includes and files. Has support for elements of the components
    arguments list to be lists or tuples of COMPONENT instances as well.

    :param components:
    :return:
    """

    flat_components = functools.reduce(flatten_reducer, components, [])
    return COMPONENT(
        includes=functools.reduce(
            functools.partial(combine_lists_reducer, 'includes'),
            flat_components,
            []
        ),
        files=functools.reduce(
            functools.partial(combine_lists_reducer, 'files'),
            flat_components,
            []
        )
    )
def merge_components ( * components : typing . List [ typing . Union [ list , tuple , COMPONENT ] ] ) -> COMPONENT : flat_components = functools . reduce ( flatten_reducer , components , [ ] ) return COMPONENT ( includes = functools . reduce ( functools . partial ( combine_lists_reducer , 'includes' ) , flat_components , [ ] ) , files = functools . reduce ( functools . partial ( combine_lists_reducer , 'files' ) , flat_components , [ ] ) )
Merges multiple COMPONENT instances into a single one by merging the
    lists of includes and files. Has support for elements of the components
    arguments list to be lists or tuples of COMPONENT instances as well.

    :param components:
    :return: