Example #1
0
    def insert_constructor(loader: SafeLoader, node: Node) -> list:
        if isinstance(node.value[0], ScalarNode):
            info = InsertInfo(
                sequence=loader.construct_object(node.value[0], deep=True))
        else:
            info = InsertInfo(
                *loader.construct_sequence(node.value[0], deep=True))
        current_list: List[Any] = info.sequence  # already constructed
        input_list: List[Any] = [
            loader.construct_object(n, deep=True) for n in node.value[1:]
        ]
        if info.replace_format is None and info.positions is None:
            return current_list + input_list

        def item_id(item: Any, idx: int) -> int:
            return idx if info.replace_format is None else formatter.format(
                info.replace_format, l=item)

        # ordered
        result_dict = {
            item_id(item, idx): item
            for idx, item in enumerate(current_list)
        }
        input_dict = {
            item_id(item, idx + len(result_dict)): item
            for idx, item in enumerate(input_list)
        }

        to_pos = {}
        to_end = []
        for input_pos, (input_id,
                        input_item) in zip_longest(info.positions or [],
                                                   input_dict.items()):
            if input_pos is not None:
                result_dict.pop(input_id, None)
                to_pos[input_pos] = input_item
            elif input_id in result_dict:
                result_dict[input_id] = input_item
            else:
                to_end.append(input_item)

        result_list = list(result_dict.values()) + to_end
        for item in sorted(to_pos):
            result_list.insert(item, to_pos[item])
        return result_list