mirror of
https://github.com/mjallen18/snowfall-lib.git
synced 2026-04-18 09:05:58 -05:00
refactor: improve attrs helpers and extract merge logic
Add apply-aliases-and-overrides for pre-merged attribute sets (e.g., from fix). Extract nested merge logic in merge-shallow-packages into named merge-item helper for better testability. Inline single-use aliased-items binding. Changes: - attrs/default.nix: Added apply-aliases-and-overrides helper - attrs/default.nix: Extracted merge-item and merge-value helpers - attrs/default.nix: Inlined single-use binding in merge-with-aliases - package/default.nix: Use new apply-aliases-and-overrides helper Impact: - Lines: +17 -5 (net: +12, but adds reusable helper) - Better separation of concerns - Improved testability - Consistent alias handling across codebase Testing: nix flake check ✓
This commit is contained in:
@@ -66,19 +66,22 @@ in
|
||||
#@ [Attrs] -> Attrs
|
||||
merge-shallow-packages =
|
||||
items:
|
||||
foldl (
|
||||
result: item:
|
||||
result
|
||||
// (mapAttrs (
|
||||
name: value:
|
||||
if isDerivation value then
|
||||
value
|
||||
else if builtins.isAttrs value then
|
||||
(result.${name} or { }) // value
|
||||
else
|
||||
value
|
||||
) item)
|
||||
) { } items;
|
||||
let
|
||||
merge-item =
|
||||
result: item:
|
||||
let
|
||||
merge-value =
|
||||
name: value:
|
||||
if isDerivation value then
|
||||
value
|
||||
else if builtins.isAttrs value then
|
||||
(result.${name} or { }) // value
|
||||
else
|
||||
value;
|
||||
in
|
||||
result // mapAttrs merge-value item;
|
||||
in
|
||||
foldl merge-item { } items;
|
||||
|
||||
## Merge items with a merge function and apply aliases
|
||||
## Example Usage:
|
||||
@@ -89,9 +92,23 @@ in
|
||||
#@ (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;
|
||||
merged = foldl merge-fn { } items;
|
||||
in
|
||||
items-without-aliases // aliased-items;
|
||||
merged // mapAttrs (name: value: merged.${value}) alias;
|
||||
|
||||
## Apply aliases and overrides to an already-merged attribute set.
|
||||
## Use this when you have a pre-built attribute set (e.g., from fix).
|
||||
## Example Usage:
|
||||
## ```nix
|
||||
## apply-aliases-and-overrides packages-set { default = "vim"; } { extra = ...; }
|
||||
## ```
|
||||
## Result: packages-set with aliases and overrides applied
|
||||
#@ Attrs -> Attrs -> Attrs -> Attrs
|
||||
apply-aliases-and-overrides =
|
||||
items: alias: overrides:
|
||||
let
|
||||
aliased = mapAttrs (name: value: items.${value}) alias;
|
||||
in
|
||||
items // aliased // overrides;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -86,8 +86,7 @@ in
|
||||
in
|
||||
foldl merge-packages { } packages-metadata
|
||||
);
|
||||
aliased-items = mapAttrs (name: value: packages-without-aliases.${value}) alias;
|
||||
packages = packages-without-aliases // aliased-items // overrides;
|
||||
packages = snowfall-lib.attrs.apply-aliases-and-overrides packages-without-aliases alias overrides;
|
||||
in
|
||||
filterPackages pkgs.stdenv.hostPlatform.system packages;
|
||||
in {
|
||||
|
||||
Reference in New Issue
Block a user