filterOverrides: init

This commit is contained in:
2025-04-08 14:36:55 +02:00
parent 18f15a2285
commit 2396dae9a6
2 changed files with 78 additions and 4 deletions

View File

@@ -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;
};
}

73
src/filterOverrides.nix Normal file
View File

@@ -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;
}