15 lines
460 B
Nix
15 lines
460 B
Nix
{ lib }:
|
|
|
|
with lib;
|
|
{
|
|
recursiveMergeAttrs = a: b: let
|
|
commonAttrs = intersectLists (attrNames a) (attrNames b);
|
|
aAttrs = subtractLists (attrNames a) commonAttrs;
|
|
bAttrs = subtractLists (attrNames b) commonAttrs;
|
|
aSide = (filterAttrs (k: v: elem k aAttrs) a);
|
|
bSide = (filterAttrs (k: v: elem k bAttrs) b);
|
|
common = (foldr (a: b: a // b) {}
|
|
(map (k: { ${k} = a.${k} // b.${k}; }) commonAttrs));
|
|
in aSide // bSide // common;
|
|
}
|