diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2006-09-25 10:07:59 +0000 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2006-09-25 10:07:59 +0000 |
commit | b8cdbb94f8bc32d857a8dd40304ce24730a9e096 (patch) | |
tree | b30ae6fa1f497f5512cd27a51cd0563b623c12c1 /pkgs/lib/default.nix | |
parent | 1e435ca929d3da3814d2b6ba33441da788aad373 (diff) | |
download | nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.tar nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.tar.gz nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.tar.bz2 nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.tar.lz nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.tar.xz nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.tar.zst nixpkgs-b8cdbb94f8bc32d857a8dd40304ce24730a9e096.zip |
* Put utility functions like fold in lib/default.nix.
svn path=/nixpkgs/trunk/; revision=6605
Diffstat (limited to 'pkgs/lib/default.nix')
-rw-r--r-- | pkgs/lib/default.nix | 42 |
1 files changed, 42 insertions, 0 deletions
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 |