about summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2006-11-27 16:58:08 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2006-11-27 16:58:08 +0000
commite7194e0ed5bffc120b465bf20c14b691759148c6 (patch)
tree9238005ccac7c6d7270bf43b61e127eb589c9769 /pkgs
parent70b5d371091a3245b2e6dc6abd036001e0a5974c (diff)
downloadnixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.tar
nixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.tar.gz
nixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.tar.bz2
nixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.tar.lz
nixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.tar.xz
nixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.tar.zst
nixlib-e7194e0ed5bffc120b465bf20c14b691759148c6.zip
* Library functions: filter, eqLists (equality on lists; the `=='
  operator is mostly broken, see NIX-62).

svn path=/nixpkgs/trunk/; revision=7151
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/lib/default.nix36
1 files changed, 28 insertions, 8 deletions
diff --git a/pkgs/lib/default.nix b/pkgs/lib/default.nix
index 9168d0dc87fc..829f8e52a208 100644
--- a/pkgs/lib/default.nix
+++ b/pkgs/lib/default.nix
@@ -1,5 +1,11 @@
 # Utility functions.
 
+let
+
+  inherit (builtins) head tail isList;
+
+in
+
 rec {
 
   # "Fold" a binary function `op' between successive elements of
@@ -9,7 +15,7 @@ rec {
   fold = op: nul: list:
     if list == []
     then nul
-    else op (builtins.head list) (fold op nul (builtins.tail list));
+    else op (head list) (fold op nul (tail list));
 
     
   # Concatenate a list of strings.
@@ -20,17 +26,17 @@ rec {
   # Place an element between each element of a list, e.g.,
   # `intersperse "," ["a" "b" "c"]' returns ["a" "," "b" "," "c"].
   intersperse = separator: list:
-    if list == [] || builtins.tail list == []
+    if list == [] || tail list == []
     then list
-    else [(builtins.head list) separator]
-         ++ (intersperse separator (builtins.tail list));
+    else [(head list) separator]
+         ++ (intersperse separator (tail list));
 
 
   # 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
+    if isList x
     then fold (x: y: (flatten x) ++ y) [] x
     else [x];
 
@@ -40,12 +46,26 @@ rec {
   # default value is returned otherwise.
   getAttr = attrPath: default: e:
     let {
-      attr = builtins.head attrPath;
+      attr = 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)
+        then getAttr (tail attrPath) default (builtins.getAttr attr e)
         else default;
     };
+
+
+  # Filter a list using a predicate; that is, return a list containing
+  # every element from `list' for which `pred' returns true.
+  filter = pred: list:
+    fold (x: y: if pred x then [x] ++ y else y) [] list;
+
+
+  # Return true if each element of a list is equal, false otherwise.
+  eqLists = xs: ys:
+    if xs == [] && ys == [] then true
+    else if xs == [] || ys == [] then false
+    else head xs == head ys && eqLists (tail xs) (tail ys);
+
   
-}
\ No newline at end of file
+}