From 8bfe3616e50979113ca29c07a6a730a18bad5260 Mon Sep 17 00:00:00 2001 From: anntnzrb Date: Thu, 9 Oct 2025 00:00:00 -0500 Subject: [PATCH] refactor: improve attrs helpers and extract merge logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 ✓ --- snowfall-lib/attrs/default.nix | 49 +++++++++++++++++++++----------- snowfall-lib/package/default.nix | 3 +- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/snowfall-lib/attrs/default.nix b/snowfall-lib/attrs/default.nix index 228a8ab..8a70baf 100644 --- a/snowfall-lib/attrs/default.nix +++ b/snowfall-lib/attrs/default.nix @@ -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; }; } diff --git a/snowfall-lib/package/default.nix b/snowfall-lib/package/default.nix index 86ad260..99a4c33 100644 --- a/snowfall-lib/package/default.nix +++ b/snowfall-lib/package/default.nix @@ -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 {