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
|
#@ [Attrs] -> Attrs
|
||||||
merge-shallow-packages =
|
merge-shallow-packages =
|
||||||
items:
|
items:
|
||||||
foldl (
|
let
|
||||||
result: item:
|
merge-item =
|
||||||
result
|
result: item:
|
||||||
// (mapAttrs (
|
let
|
||||||
name: value:
|
merge-value =
|
||||||
if isDerivation value then
|
name: value:
|
||||||
value
|
if isDerivation value then
|
||||||
else if builtins.isAttrs value then
|
value
|
||||||
(result.${name} or { }) // value
|
else if builtins.isAttrs value then
|
||||||
else
|
(result.${name} or { }) // value
|
||||||
value
|
else
|
||||||
) item)
|
value;
|
||||||
) { } items;
|
in
|
||||||
|
result // mapAttrs merge-value item;
|
||||||
|
in
|
||||||
|
foldl merge-item { } items;
|
||||||
|
|
||||||
## Merge items with a merge function and apply aliases
|
## Merge items with a merge function and apply aliases
|
||||||
## Example Usage:
|
## Example Usage:
|
||||||
@@ -89,9 +92,23 @@ in
|
|||||||
#@ (Attrs -> Attrs -> Attrs) -> [Attrs] -> Attrs -> Attrs
|
#@ (Attrs -> Attrs -> Attrs) -> [Attrs] -> Attrs -> Attrs
|
||||||
merge-with-aliases = merge-fn: items: alias:
|
merge-with-aliases = merge-fn: items: alias:
|
||||||
let
|
let
|
||||||
items-without-aliases = foldl merge-fn { } items;
|
merged = foldl merge-fn { } items;
|
||||||
aliased-items = mapAttrs (name: value: items-without-aliases.${value}) alias;
|
|
||||||
in
|
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
|
in
|
||||||
foldl merge-packages { } packages-metadata
|
foldl merge-packages { } packages-metadata
|
||||||
);
|
);
|
||||||
aliased-items = mapAttrs (name: value: packages-without-aliases.${value}) alias;
|
packages = snowfall-lib.attrs.apply-aliases-and-overrides packages-without-aliases alias overrides;
|
||||||
packages = packages-without-aliases // aliased-items // overrides;
|
|
||||||
in
|
in
|
||||||
filterPackages pkgs.stdenv.hostPlatform.system packages;
|
filterPackages pkgs.stdenv.hostPlatform.system packages;
|
||||||
in {
|
in {
|
||||||
|
|||||||
Reference in New Issue
Block a user