mirror of
https://github.com/mjallen18/snowfall-lib.git
synced 2026-04-18 00:55:58 -05:00
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:
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user