* Put utility functions like fold in lib/default.nix.
svn path=/nixpkgs/trunk/; revision=6605
This commit is contained in:
parent
1e435ca929
commit
b8cdbb94f8
42
pkgs/lib/default.nix
Normal file
42
pkgs/lib/default.nix
Normal file
@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -77,18 +77,7 @@ rec {
|
|||||||
|
|
||||||
useFromStdenv = hasIt: it: alternative: if hasIt then it else alternative;
|
useFromStdenv = hasIt: it: alternative: if hasIt then it else alternative;
|
||||||
|
|
||||||
# Return an attribute from nested attribute sets. For instance ["x"
|
inherit (import ../lib) getAttr;
|
||||||
# "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;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Return an attribute from the Nixpkgs configuration file, or
|
# Return an attribute from the Nixpkgs configuration file, or
|
||||||
# a default value if the attribute doesn't exist.
|
# a default value if the attribute doesn't exist.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user