mirror of
https://github.com/ruuda/rcl.git
synced 2025-10-07 15:40:49 +00:00
39 lines
1 KiB
Text
39 lines
1 KiB
Text
// Given the following mapping of group names to members devices:
|
|
let group_devices = {
|
|
ch = ["zrh01", "zrh02"],
|
|
de = ["fra01", "fra02", "fra03"],
|
|
nl = ["ams01", "ams02"],
|
|
us = ["lax01"],
|
|
intel = ["fra01", "fra02", "fra03", "lax01"],
|
|
};
|
|
|
|
// We want to construct the inverse mapping of devices to group memberships.
|
|
// We can do this by first flattening to memberships, then grouping, and then
|
|
// removing redundant information.
|
|
let memberships = [
|
|
for group, members in group_devices:
|
|
for device in members:
|
|
{ group = group, device = device }
|
|
];
|
|
let result_1 = {
|
|
for device, ms in memberships.group_by(m => m.device):
|
|
device: [for m in ms: m.group]
|
|
};
|
|
|
|
// Alternatively, we can first compute all unique devices, and then for every
|
|
// device, see which groups it's a member of.
|
|
let devices = {
|
|
for _group, devices in group_devices:
|
|
for device in devices:
|
|
device
|
|
};
|
|
let result_2 = {
|
|
for device in devices:
|
|
device: [
|
|
for group, g_devs in group_devices:
|
|
if g_devs.contains(device):
|
|
group
|
|
]
|
|
};
|
|
|
|
[result_1, result_2]
|