diff --git a/pkgs/lib/default.nix b/pkgs/lib/default.nix new file mode 100644 index 00000000000..40241fb636c --- /dev/null +++ b/pkgs/lib/default.nix @@ -0,0 +1,42 @@ +# Utility functions. + +rec { + + # "Fold" a binary function `op' between successive elements of + # `list' with `nul' as the starting value, i.e., `fold op nul [x_1 + # x_2 ... x_n] == op x_1 (op x_2 ... (op x_n nul))'. (This is + # Haskell's foldr). + fold = op: nul: list: + if list == [] + then nul + else op (builtins.head list) (fold op nul (builtins.tail list)); + + + # Concatenate a list of strings. + concatStrings = + fold (x: y: x + y) ""; + + + # Flatten the argument into a single list; that is, nested lists are + # spliced into the top-level lists. E.g., `flatten [1 [2 [3] 4] 5] + # == [1 2 3 4 5]' and `flatten 1 == [1]'. + flatten = x: + if builtins.isList x + then fold (x: y: (flatten x) ++ y) [] x + else [x]; + + + # Return an attribute from nested attribute sets. For instance ["x" + # "y"] applied to some set e returns e.x.y, if it exists. The + # default value is returned otherwise. + getAttr = attrPath: default: e: + let { + attr = builtins.head attrPath; + body = + if attrPath == [] then e + else if builtins ? hasAttr && builtins.hasAttr attr e + then getAttr (builtins.tail attrPath) default (builtins.getAttr attr e) + else default; + }; + +} \ No newline at end of file diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 5ecb5447c7c..3696f34f2bf 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -77,19 +77,8 @@ rec { useFromStdenv = hasIt: it: alternative: if hasIt then it else alternative; - # Return an attribute from nested attribute sets. For instance ["x" - # "y"] applied to some set e returns e.x.y, if it exists. The - # default value is returned otherwise. - getAttr = attrPath: default: e: - let { - attr = builtins.head attrPath; - body = - if attrPath == [] then e - else if builtins ? hasAttr && builtins.hasAttr attr e - then getAttr (builtins.tail attrPath) default (builtins.getAttr attr e) - else default; - }; - + inherit (import ../lib) getAttr; + # Return an attribute from the Nixpkgs configuration file, or # a default value if the attribute doesn't exist. getConfig = attrPath: default: getAttr attrPath default config;