From 973b06a6455c6aa759fe1662967611c8ac7022aa Mon Sep 17 00:00:00 2001 From: anntnzrb Date: Wed, 8 Oct 2025 22:40:48 -0500 Subject: [PATCH] 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. --- snowfall-lib/attrs/default.nix | 14 ++++++++++++++ snowfall-lib/checks/default.nix | 4 +--- snowfall-lib/default.nix | 15 +++++++++------ snowfall-lib/flake/default.nix | 15 +++++++++------ snowfall-lib/module/default.nix | 4 +--- snowfall-lib/package/default.nix | 4 +--- snowfall-lib/shell/default.nix | 4 +--- snowfall-lib/template/default.nix | 4 +--- 8 files changed, 37 insertions(+), 27 deletions(-) diff --git a/snowfall-lib/attrs/default.nix b/snowfall-lib/attrs/default.nix index 8c91ed2..228a8ab 100644 --- a/snowfall-lib/attrs/default.nix +++ b/snowfall-lib/attrs/default.nix @@ -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; }; } diff --git a/snowfall-lib/checks/default.nix b/snowfall-lib/checks/default.nix index 000c486..8a5efde 100644 --- a/snowfall-lib/checks/default.nix +++ b/snowfall-lib/checks/default.nix @@ -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; }; diff --git a/snowfall-lib/default.nix b/snowfall-lib/default.nix index 78061f7..b88d06a 100644 --- a/snowfall-lib/default.nix +++ b/snowfall-lib/default.nix @@ -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 diff --git a/snowfall-lib/flake/default.nix b/snowfall-lib/flake/default.nix index 465891d..a696927 100644 --- a/snowfall-lib/flake/default.nix +++ b/snowfall-lib/flake/default.nix @@ -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 = diff --git a/snowfall-lib/module/default.nix b/snowfall-lib/module/default.nix index b002c1a..97f892a 100644 --- a/snowfall-lib/module/default.nix +++ b/snowfall-lib/module/default.nix @@ -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; }; diff --git a/snowfall-lib/package/default.nix b/snowfall-lib/package/default.nix index 7743dd0..377d88d 100644 --- a/snowfall-lib/package/default.nix +++ b/snowfall-lib/package/default.nix @@ -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; }; diff --git a/snowfall-lib/shell/default.nix b/snowfall-lib/shell/default.nix index c4772e2..77352a7 100644 --- a/snowfall-lib/shell/default.nix +++ b/snowfall-lib/shell/default.nix @@ -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; }; diff --git a/snowfall-lib/template/default.nix b/snowfall-lib/template/default.nix index 8ef21a5..ad3f828 100644 --- a/snowfall-lib/template/default.nix +++ b/snowfall-lib/template/default.nix @@ -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; };