35 lines
1.1 KiB
Text
35 lines
1.1 KiB
Text
|
|
# Test: Non-recursive merge (single level only)
|
||
|
|
{
|
||
|
|
merge_shallow = fun base override =>
|
||
|
|
if (std.typeof base) == "record" && (std.typeof override) == "record" then
|
||
|
|
let base_fields = std.record.fields base in
|
||
|
|
let override_fields = std.record.fields override in
|
||
|
|
|
||
|
|
# Pass 1: iterate base fields
|
||
|
|
base_fields
|
||
|
|
|> std.array.fold_left
|
||
|
|
(fun acc key =>
|
||
|
|
let base_value = std.record.get key base in
|
||
|
|
if std.record.has_field key override then
|
||
|
|
let override_value = std.record.get key override in
|
||
|
|
acc |> std.record.insert key override_value
|
||
|
|
else
|
||
|
|
acc |> std.record.insert key base_value
|
||
|
|
)
|
||
|
|
{}
|
||
|
|
# Pass 2: add override-only fields
|
||
|
|
|> (fun merged =>
|
||
|
|
override_fields
|
||
|
|
|> std.array.fold_left
|
||
|
|
(fun acc key =>
|
||
|
|
if !(std.record.has_field key base) then
|
||
|
|
acc |> std.record.insert key (std.record.get key override)
|
||
|
|
else
|
||
|
|
acc
|
||
|
|
)
|
||
|
|
merged
|
||
|
|
)
|
||
|
|
else
|
||
|
|
if (std.typeof override) == "null" then base else override,
|
||
|
|
}
|