36 lines
989 B
Plaintext
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
|
||
|
}
|