From 2396dae9a653591fd820153688d39119e81daf74 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 8 Apr 2025 14:36:55 +0200 Subject: [PATCH] filterOverrides: init --- flake.nix | 9 ++--- src/filterOverrides.nix | 73 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 src/filterOverrides.nix diff --git a/flake.nix b/flake.nix index ac9f9e4..8ea6191 100644 --- a/flake.nix +++ b/flake.nix @@ -10,13 +10,14 @@ in { inherit util; + collect = import ./src/collect.nix lib; + filterAttrs = import ./src/filterAttrs.nix lib; + filterOverrides = import ./src/filterOverrides.nix lib; + findFirstIndex = import ./src/findFirstIndex.nix lib; genAttrs = import ./src/genAttrs.nix lib; getAttrs = import ./src/getAttrs.nix lib; + overrideExisting = import ./src/overrideExisting.nix lib; subtractLists = import ./src/subtractLists.nix lib; unique = import ./src/unique.nix lib; - overrideExisting = import ./src/overrideExisting.nix lib; - findFirstIndex = import ./src/findFirstIndex.nix lib; - filterAttrs = import ./src/filterAttrs.nix lib; - collect = import ./src/collect.nix lib; }; } diff --git a/src/filterOverrides.nix b/src/filterOverrides.nix new file mode 100644 index 0000000..a7e9590 --- /dev/null +++ b/src/filterOverrides.nix @@ -0,0 +1,73 @@ +lib: +with lib; +let + defaultOverridePriority = 100; + + /** + Given a list of config values, process the mkOverride properties, + that is, return the values that have the highest (that is, + numerically lowest) priority, and strip the mkOverride + properties. For example, + + [ { file = "/1"; value = mkOverride 10 "a"; } + { file = "/2"; value = mkOverride 20 "b"; } + { file = "/3"; value = "z"; } + { file = "/4"; value = mkOverride 10 "d"; } + ] + + yields + + [ { file = "/1"; value = "a"; } + { file = "/4"; value = "d"; } + ] + + Note that "z" has the default priority 100. + + # Inputs + + `defs` + + : 1\. Function argument + */ + filterOverridesOld = let + filterOverrides' = + defs: + let + getPrio = + def: if def.value._type or "" == "override" then def.value.priority else defaultOverridePriority; + highestPrio = foldl' (prio: def: min (getPrio def) prio) 9999 defs; + strip = + def: if def.value._type or "" == "override" then def // { value = def.value.content; } else def; + in + { + values = concatMap (def: if getPrio def == highestPrio then [ (strip def) ] else [ ]) defs; + inherit highestPrio; + }; + in defs: (filterOverrides' defs).values; + + filterOverridesNew = let + filterOverrides' = + defs: + let + normalizedList = map (def: if def.value._type or null == "override" then { + prio = def.value.priority; + ${toString def.value.priority} = def.value.content; + } else { + prio = defaultOverridePriority; + ${toString defaultOverridePriority} = def.value; + }) defs; + + highestPriority = foldl' min 9999 (catAttrs "prio" normalizedList); + in + { + values = catAttrs (toString highestPriority) normalizedList; + inherit highestPriority; + }; + in defs: (filterOverrides' defs).values; + + bigdata = (builtins.genList (x: { file = "asdf"; value = mkOverride x (toString x); }) 999) + ++ (builtins.genList (x: { file = "qwerty"; value = toString x; }) 999); +in { + old = filterOverridesOld bigdata; + new = filterOverridesNew bigdata; +}