def list_with_base_rules(rawrules):
    """Combine the list of rules set by the user with the default push rules

    :param list rawrules: The rules the user has modified or set.
    :returns: A new list with the rules set by the user combined with the
        defaults.
    """
    ruleslist = []

    # Grab the base rules that the user has modified.
    # The modified base rules have a priority_class of -1.
    modified_base_rules = {
        r['rule_id']: r for r in rawrules if r['priority_class'] < 0
    }

    # Remove the modified base rules from the list, They'll be added back
    # in the default postions in the list.
    rawrules = [r for r in rawrules if r['priority_class'] >= 0]

    # shove the server default rules for each kind onto the end of each
    current_prio_class = PRIORITY_CLASS_INVERSE_MAP.keys()[-1]

    ruleslist.extend(make_base_prepend_rules(
        PRIORITY_CLASS_INVERSE_MAP[current_prio_class], modified_base_rules
    ))

    for r in rawrules:
        if r['priority_class'] < current_prio_class:
            while r['priority_class'] < current_prio_class:
                ruleslist.extend(make_base_append_rules(
                    PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
                    modified_base_rules,
                ))
                current_prio_class -= 1
                if current_prio_class > 0:
                    ruleslist.extend(make_base_prepend_rules(
                        PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
                        modified_base_rules,
                    ))

        ruleslist.append(r)

    while current_prio_class > 0:
        ruleslist.extend(make_base_append_rules(
            PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
            modified_base_rules,
        ))
        current_prio_class -= 1
        if current_prio_class > 0:
            ruleslist.extend(make_base_prepend_rules(
                PRIORITY_CLASS_INVERSE_MAP[current_prio_class],
                modified_base_rules,
            ))

    return ruleslist
dataset/ETHPy150Open matrix-org/synapse/synapse/push/baserules.py/list_with_base_rules/original