# select_multi works around a restriction in native select() that prevents multiple # keys from being matched unless one is a strict subset of another. For some features, # we allow multiple of that component to be active. For example, with codecs, we let # the clients mix and match anywhere from 0 built in codecs to all of them. # # select_multi takes a given map and turns it into several distinct select statements # that have the effect of using any values associated with any active keys. # For example, if the following parameters are passed in: # values_map = { # ":alpha": ["apple", "apricot"], # ":beta": ["banana"], # ":gamma": ["grapefruit"], # }, # default = [] # it will be unrolled into the following select statements # [] + select({ # ":apple": ["apple", "apricot"], # "//conditions:default": [], # }) + select({ # ":beta": ["banana"], # "//conditions:default": [], # }) + select({ # ":gamma": ["grapefruit"], # "//conditions:default": [], # }) def select_multi(values_map, default): if len(values_map) == 0: return default rv = [] for key, value in values_map.items(): rv += select({ key: value, "//conditions:default": default, }) return rv