refactor: reduce code duplication with merge-with-aliases helper

Add merge-with-aliases function to attrs module and use it across checks,
modules, packages, shells, and templates to eliminate repeated alias merging
logic. Also optimize get-libs by replacing filter+map with a fold operation.
This commit is contained in:
anntnzrb
2025-10-08 22:40:48 -05:00
parent a905b259d5
commit 973b06a645
8 changed files with 37 additions and 27 deletions

View File

@@ -79,5 +79,19 @@ in
value
) item)
) { } items;
## Merge items with a merge function and apply aliases
## Example Usage:
## ```nix
## merge-with-aliases merge-packages packages-metadata alias
## ```
## Result: Merged items with aliases applied
#@ (Attrs -> Attrs -> Attrs) -> [Attrs] -> Attrs -> Attrs
merge-with-aliases = merge-fn: items: alias:
let
items-without-aliases = foldl merge-fn { } items;
aliased-items = mapAttrs (name: value: items-without-aliases.${value}) alias;
in
items-without-aliases // aliased-items;
};
}

View File

@@ -58,9 +58,7 @@ in
// {
${metadata.name} = metadata.drv;
};
checks-without-aliases = foldl merge-checks { } checks-metadata;
aliased-checks = mapAttrs (name: value: checks-without-aliases.${value}) alias;
checks = checks-without-aliases // aliased-checks // overrides;
checks = snowfall-lib.attrs.merge-with-aliases merge-checks checks-metadata alias // overrides;
in
filterPackages pkgs.stdenv.hostPlatform.system checks;
};

View File

@@ -50,12 +50,15 @@ let
# result: { x = nixpkgs.lib; }
get-libs =
attrs:
let
# @PERF(jakehamilton): Replace filter+map with a fold.
attrs-with-libs = filterAttrs (name: value: builtins.isAttrs (value.lib or null)) attrs;
libs = builtins.mapAttrs (name: input: input.lib) attrs-with-libs;
in
libs;
fold
(acc: name:
let value = attrs.${name}; in
if builtins.isAttrs (value.lib or null)
then acc // { ${name} = value.lib; }
else acc
)
{ }
(builtins.attrNames attrs);
# Remove the `self` attribute from an attribute set.
# Type: Attrs -> Attrs

View File

@@ -97,12 +97,15 @@ rec {
#@ Attrs -> Attrs
get-libs =
attrs:
let
# @PERF(jakehamilton): Replace filter+map with a fold.
attrs-with-libs = filterAttrs (name: value: builtins.isAttrs (value.lib or null)) attrs;
libs = builtins.mapAttrs (name: input: input.lib) attrs-with-libs;
in
libs;
foldl
(acc: name:
let value = attrs.${name}; in
if builtins.isAttrs (value.lib or null)
then acc // { ${name} = value.lib; }
else acc
)
{ }
(builtins.attrNames attrs);
};
mkFlake =

View File

@@ -95,9 +95,7 @@ in
in
user-module // { _file = metadata.path; };
};
modules-without-aliases = foldl merge-modules { } modules-metadata;
aliased-modules = mapAttrs (name: value: modules-without-aliases.${value}) alias;
modules = modules-without-aliases // aliased-modules // overrides;
modules = snowfall-lib.attrs.merge-with-aliases merge-modules modules-metadata alias // overrides;
in
modules;
};

View File

@@ -77,9 +77,7 @@ in
// {
${metadata.name} = metadata.drv;
};
packages-without-aliases = foldl merge-packages { } packages-metadata;
aliased-packages = mapAttrs (name: value: packages-without-aliases.${value}) alias;
packages = packages-without-aliases // aliased-packages // overrides;
packages = snowfall-lib.attrs.merge-with-aliases merge-packages packages-metadata alias // overrides;
in
filterPackages pkgs.stdenv.hostPlatform.system packages;
};

View File

@@ -58,9 +58,7 @@ in
// {
${metadata.name} = metadata.drv;
};
shells-without-aliases = foldl merge-shells { } shells-metadata;
aliased-shells = mapAttrs (name: value: shells-without-aliases.${value}) alias;
shells = shells-without-aliases // aliased-shells // overrides;
shells = snowfall-lib.attrs.merge-with-aliases merge-shells shells-metadata alias // overrides;
in
filterPackages pkgs.stdenv.hostPlatform.system shells;
};

View File

@@ -53,12 +53,10 @@ in
${metadata.name} =
(overrides.${metadata.name} or { }) // (builtins.removeAttrs metadata [ "name" ]);
};
templates-without-aliases = foldl merge-templates { } templates-metadata;
aliased-templates = mapAttrs (name: value: templates-without-aliases.${value}) alias;
unused-overrides = builtins.removeAttrs overrides (
builtins.map (metadata: metadata.name) templates-metadata
);
templates = templates-without-aliases // aliased-templates // unused-overrides;
templates = snowfall-lib.attrs.merge-with-aliases merge-templates templates-metadata alias // unused-overrides;
in
templates;
};