mirror of
https://github.com/mjallen18/snowfall-lib.git
synced 2026-04-18 09:05: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
|
value
|
||||||
) item)
|
) item)
|
||||||
) { } items;
|
) { } 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;
|
${metadata.name} = metadata.drv;
|
||||||
};
|
};
|
||||||
checks-without-aliases = foldl merge-checks { } checks-metadata;
|
checks = snowfall-lib.attrs.merge-with-aliases merge-checks checks-metadata alias // overrides;
|
||||||
aliased-checks = mapAttrs (name: value: checks-without-aliases.${value}) alias;
|
|
||||||
checks = checks-without-aliases // aliased-checks // overrides;
|
|
||||||
in
|
in
|
||||||
filterPackages pkgs.stdenv.hostPlatform.system checks;
|
filterPackages pkgs.stdenv.hostPlatform.system checks;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -50,12 +50,15 @@ let
|
|||||||
# result: { x = nixpkgs.lib; }
|
# result: { x = nixpkgs.lib; }
|
||||||
get-libs =
|
get-libs =
|
||||||
attrs:
|
attrs:
|
||||||
let
|
fold
|
||||||
# @PERF(jakehamilton): Replace filter+map with a fold.
|
(acc: name:
|
||||||
attrs-with-libs = filterAttrs (name: value: builtins.isAttrs (value.lib or null)) attrs;
|
let value = attrs.${name}; in
|
||||||
libs = builtins.mapAttrs (name: input: input.lib) attrs-with-libs;
|
if builtins.isAttrs (value.lib or null)
|
||||||
in
|
then acc // { ${name} = value.lib; }
|
||||||
libs;
|
else acc
|
||||||
|
)
|
||||||
|
{ }
|
||||||
|
(builtins.attrNames attrs);
|
||||||
|
|
||||||
# Remove the `self` attribute from an attribute set.
|
# Remove the `self` attribute from an attribute set.
|
||||||
# Type: Attrs -> Attrs
|
# Type: Attrs -> Attrs
|
||||||
|
|||||||
@@ -97,12 +97,15 @@ rec {
|
|||||||
#@ Attrs -> Attrs
|
#@ Attrs -> Attrs
|
||||||
get-libs =
|
get-libs =
|
||||||
attrs:
|
attrs:
|
||||||
let
|
foldl
|
||||||
# @PERF(jakehamilton): Replace filter+map with a fold.
|
(acc: name:
|
||||||
attrs-with-libs = filterAttrs (name: value: builtins.isAttrs (value.lib or null)) attrs;
|
let value = attrs.${name}; in
|
||||||
libs = builtins.mapAttrs (name: input: input.lib) attrs-with-libs;
|
if builtins.isAttrs (value.lib or null)
|
||||||
in
|
then acc // { ${name} = value.lib; }
|
||||||
libs;
|
else acc
|
||||||
|
)
|
||||||
|
{ }
|
||||||
|
(builtins.attrNames attrs);
|
||||||
};
|
};
|
||||||
|
|
||||||
mkFlake =
|
mkFlake =
|
||||||
|
|||||||
@@ -95,9 +95,7 @@ in
|
|||||||
in
|
in
|
||||||
user-module // { _file = metadata.path; };
|
user-module // { _file = metadata.path; };
|
||||||
};
|
};
|
||||||
modules-without-aliases = foldl merge-modules { } modules-metadata;
|
modules = snowfall-lib.attrs.merge-with-aliases merge-modules modules-metadata alias // overrides;
|
||||||
aliased-modules = mapAttrs (name: value: modules-without-aliases.${value}) alias;
|
|
||||||
modules = modules-without-aliases // aliased-modules // overrides;
|
|
||||||
in
|
in
|
||||||
modules;
|
modules;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -77,9 +77,7 @@ in
|
|||||||
// {
|
// {
|
||||||
${metadata.name} = metadata.drv;
|
${metadata.name} = metadata.drv;
|
||||||
};
|
};
|
||||||
packages-without-aliases = foldl merge-packages { } packages-metadata;
|
packages = snowfall-lib.attrs.merge-with-aliases merge-packages packages-metadata alias // overrides;
|
||||||
aliased-packages = mapAttrs (name: value: packages-without-aliases.${value}) alias;
|
|
||||||
packages = packages-without-aliases // aliased-packages // overrides;
|
|
||||||
in
|
in
|
||||||
filterPackages pkgs.stdenv.hostPlatform.system packages;
|
filterPackages pkgs.stdenv.hostPlatform.system packages;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -58,9 +58,7 @@ in
|
|||||||
// {
|
// {
|
||||||
${metadata.name} = metadata.drv;
|
${metadata.name} = metadata.drv;
|
||||||
};
|
};
|
||||||
shells-without-aliases = foldl merge-shells { } shells-metadata;
|
shells = snowfall-lib.attrs.merge-with-aliases merge-shells shells-metadata alias // overrides;
|
||||||
aliased-shells = mapAttrs (name: value: shells-without-aliases.${value}) alias;
|
|
||||||
shells = shells-without-aliases // aliased-shells // overrides;
|
|
||||||
in
|
in
|
||||||
filterPackages pkgs.stdenv.hostPlatform.system shells;
|
filterPackages pkgs.stdenv.hostPlatform.system shells;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -53,12 +53,10 @@ in
|
|||||||
${metadata.name} =
|
${metadata.name} =
|
||||||
(overrides.${metadata.name} or { }) // (builtins.removeAttrs 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 (
|
unused-overrides = builtins.removeAttrs overrides (
|
||||||
builtins.map (metadata: metadata.name) templates-metadata
|
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
|
in
|
||||||
templates;
|
templates;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user