Unverified Commit 91969d8d authored by figsoda's avatar figsoda Committed by GitHub
Browse files

Merge pull request #201527 from figsoda/lib

lib/attrsets: add concatMapAttrs
parents 6b5019a4 d1dd00b6
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@

let
  inherit (builtins) head tail length;
  inherit (lib.trivial) id;
  inherit (lib.trivial) flip id mergeAttrs pipe;
  inherit (lib.strings) concatStringsSep concatMapStringsSep escapeNixIdentifier sanitizeDerivationName;
  inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all partition groupBy take foldl;
in
@@ -77,6 +77,25 @@ rec {
    let errorMsg = "cannot find attribute `" + concatStringsSep "." attrPath + "'";
    in attrByPath attrPath (abort errorMsg);

  /* Map each attribute in the given set and merge them into a new attribute set.

     Type:
       concatMapAttrs ::
         (String -> a -> AttrSet)
         -> AttrSet
         -> AttrSet

     Example:
       concatMapAttrs
         (name: value: {
           ${name} = value;
           ${name + value} = value;
         })
         { x = "a"; y = "b"; }
       => { x = "a"; xa = "a"; y = "b"; yb = "b"; }
  */
  concatMapAttrs = f: flip pipe [ (mapAttrs f) attrValues (foldl' mergeAttrs { }) ];


  /* Update or set specific paths of an attribute set.

@@ -606,7 +625,7 @@ rec {
  getMan = getOutput "man";

  /* Pick the outputs of packages to place in buildInputs */
  chooseDevOutputs = drvs: builtins.map getDev drvs;
  chooseDevOutputs = builtins.map getDev;

  /* Make various Nix tools consider the contents of the resulting
     attribute set when looking for what to build, find, etc.
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ let
    inherit (self.attrsets) attrByPath hasAttrByPath setAttrByPath
      getAttrFromPath attrVals attrValues getAttrs catAttrs filterAttrs
      filterAttrsRecursive foldAttrs collect nameValuePair mapAttrs
      mapAttrs' mapAttrsToList mapAttrsRecursive mapAttrsRecursiveCond
      mapAttrs' mapAttrsToList concatMapAttrs mapAttrsRecursive mapAttrsRecursiveCond
      genAttrs isDerivation toDerivation optionalAttrs
      zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil
      recursiveUpdate matchAttrs overrideExisting showAttrPath getOutput getBin
+17 −0
Original line number Diff line number Diff line
@@ -478,6 +478,23 @@ runTests {

# ATTRSETS

  testConcatMapAttrs = {
    expr = concatMapAttrs
      (name: value: {
        ${name} = value;
        ${name + value} = value;
      })
      {
        foo = "bar";
        foobar = "baz";
      };
    expected = {
      foo = "bar";
      foobar = "baz";
      foobarbaz = "baz";
    };
  };

  # code from the example
  testRecursiveUpdateUntil = {
    expr = recursiveUpdateUntil (path: l: r: path == ["foo"]) {
+3 −3
Original line number Diff line number Diff line
@@ -22,9 +22,9 @@ let
  # we can only check for values consistently after converting them to their corresponding environment variable name.
  configEnv =
    let
      configEnv = listToAttrs (concatLists (mapAttrsToList (name: value:
        if value != null then [ (nameValuePair (nameToEnvVar name) (if isBool value then boolToString value else toString value)) ] else []
      ) cfg.config));
      configEnv = concatMapAttrs (name: value: optionalAttrs (value != null) {
        ${nameToEnvVar name} = if isBool value then boolToString value else toString value;
      }) cfg.config;
    in { DATA_FOLDER = "/var/lib/bitwarden_rs"; } // optionalAttrs (!(configEnv ? WEB_VAULT_ENABLED) || configEnv.WEB_VAULT_ENABLED == "true") {
      WEB_VAULT_FOLDER = "${cfg.webVaultPackage}/share/vaultwarden/vault";
    } // configEnv;
+12 −12
Original line number Diff line number Diff line
@@ -14,18 +14,18 @@ let
  #   ocaml-interface
  #   tree-sitter-ocaml-interface
  #   tree-sitter-ocaml_interface
  builtGrammars = generatedGrammars // lib.listToAttrs
    (lib.concatLists (lib.mapAttrsToList
  builtGrammars = generatedGrammars // lib.concatMapAttrs
    (k: v:
      let
        replaced = lib.replaceStrings [ "_" ] [ "-" ] k;
      in
        map (lib.flip lib.nameValuePair v)
          ([ "tree-sitter-${k}" ] ++ lib.optionals (k != replaced) [
            replaced
            "tree-sitter-${replaced}"
          ]))
      generatedDerivations));
      {
        "tree-sitter-${k}" = v;
      } // lib.optionalAttrs (k != replaced) {
        ${replaced} = v;
        "tree-sitter-${replaced}" = v;
      })
    generatedDerivations;

  allGrammars = lib.attrValues generatedDerivations;