1cb93a386Sopenharmony_ci# select_multi works around a restriction in native select() that prevents multiple 2cb93a386Sopenharmony_ci# keys from being matched unless one is a strict subset of another. For some features, 3cb93a386Sopenharmony_ci# we allow multiple of that component to be active. For example, with codecs, we let 4cb93a386Sopenharmony_ci# the clients mix and match anywhere from 0 built in codecs to all of them. 5cb93a386Sopenharmony_ci# 6cb93a386Sopenharmony_ci# select_multi takes a given map and turns it into several distinct select statements 7cb93a386Sopenharmony_ci# that have the effect of using any values associated with any active keys. 8cb93a386Sopenharmony_ci# For example, if the following parameters are passed in: 9cb93a386Sopenharmony_ci# values_map = { 10cb93a386Sopenharmony_ci# ":alpha": ["apple", "apricot"], 11cb93a386Sopenharmony_ci# ":beta": ["banana"], 12cb93a386Sopenharmony_ci# ":gamma": ["grapefruit"], 13cb93a386Sopenharmony_ci# }, 14cb93a386Sopenharmony_ci# default = [] 15cb93a386Sopenharmony_ci# it will be unrolled into the following select statements 16cb93a386Sopenharmony_ci# [] + select({ 17cb93a386Sopenharmony_ci# ":apple": ["apple", "apricot"], 18cb93a386Sopenharmony_ci# "//conditions:default": [], 19cb93a386Sopenharmony_ci# }) + select({ 20cb93a386Sopenharmony_ci# ":beta": ["banana"], 21cb93a386Sopenharmony_ci# "//conditions:default": [], 22cb93a386Sopenharmony_ci# }) + select({ 23cb93a386Sopenharmony_ci# ":gamma": ["grapefruit"], 24cb93a386Sopenharmony_ci# "//conditions:default": [], 25cb93a386Sopenharmony_ci# }) 26cb93a386Sopenharmony_cidef select_multi(values_map, default): 27cb93a386Sopenharmony_ci if len(values_map) == 0: 28cb93a386Sopenharmony_ci return default 29cb93a386Sopenharmony_ci rv = [] 30cb93a386Sopenharmony_ci for key, value in values_map.items(): 31cb93a386Sopenharmony_ci rv += select({ 32cb93a386Sopenharmony_ci key: value, 33cb93a386Sopenharmony_ci "//conditions:default": default, 34cb93a386Sopenharmony_ci }) 35cb93a386Sopenharmony_ci return rv 36