|  | # Copyright 2020 The Flutter Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """Helper functions for Flutter LUCI configs.""" | 
|  |  | 
|  | def _merge_dicts(a, b): | 
|  | """Returns a new dictionary from the result of merging a and b. | 
|  |  | 
|  | If matching values are both dicts or both lists, they will be merged (non-recursively). | 
|  |  | 
|  | Args: | 
|  | a: first dict. | 
|  | b: second dict (takes priority). | 
|  |  | 
|  | Returns: | 
|  | Merged dict. | 
|  | """ | 
|  | new_dict = dict() | 
|  | a = dict(a) | 
|  | for k, av in a.items(): | 
|  | new_dict[k] = av | 
|  | for k, bv in b.items(): | 
|  | av = a.get(k) | 
|  | if type(av) == "dict" and type(bv) == "dict": | 
|  | new_dict[k] = dict(av) | 
|  | new_dict[k].update(bv) | 
|  | elif type(av) == "list" and type(bv) == "list": | 
|  | new_dict[k] = av + bv | 
|  | else: | 
|  | new_dict[k] = bv | 
|  | return new_dict | 
|  |  | 
|  | def _merge_lists(a, b): | 
|  | """Return the result of merging two lists. | 
|  |  | 
|  | Args: | 
|  | a: first list. | 
|  | b: second list (takes priority). | 
|  |  | 
|  | Returns: | 
|  | Merged list. | 
|  | """ | 
|  | merged = [] | 
|  | for item in b: | 
|  | merged.append(item) | 
|  | for item in a: | 
|  | if item not in merged: | 
|  | merged.append(item) | 
|  | return merged | 
|  |  | 
|  | helpers = struct(merge_dicts = _merge_dicts, merge_lists = _merge_lists) |