Bauke/cv
Bauke
/
cv
1
Fork 0
cv/utilities/merge-dictionaries.typ

36 lines
989 B
Plaintext

/// Merge dictionaries together by recursively going through each key. Any
/// non-dictionary keys will be overwritten by whichever value comes last.
#let merge_dictionaries(
/// When two array are found for the same key, merge them together.
merge_arrays: true,
..args,
) = {
let output = (:)
for arg in args.pos() {
assert.eq(type(arg), dictionary, message: "Can't merge non-dictionary types.")
for (key, value) in arg {
if key not in output {
output.insert(key, value)
continue
}
let value_type = type(value)
let existing_type = type(output.at(key))
if value_type == dictionary and existing_type == dictionary {
output.at(key) = merge_dictionaries(output.at(key), value)
} else if merge_arrays and value_type == array and existing_type == array {
for item in value {
output.at(key).push(item)
}
} else {
output.at(key) = value
}
}
}
return output
}