summary refs log tree commit diff
path: root/pkgs/lib/default.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2006-09-25 10:07:59 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2006-09-25 10:07:59 +0000
commitb8cdbb94f8bc32d857a8dd40304ce24730a9e096 (patch)
treeb30ae6fa1f497f5512cd27a51cd0563b623c12c1 /pkgs/lib/default.nix
parent1e435ca929d3da3814d2b6ba33441da788aad373 (diff)
downloadnixpkgs-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.nix42
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