summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/lib/lists.nix6
-rw-r--r--pkgs/lib/tests.nix9
2 files changed, 15 insertions, 0 deletions
diff --git a/pkgs/lib/lists.nix b/pkgs/lib/lists.nix
index 3a5ed2628de..4359662da27 100644
--- a/pkgs/lib/lists.nix
+++ b/pkgs/lib/lists.nix
@@ -161,4 +161,10 @@ rec {
     in
       qs list [];
 
+
+  # haskell's take:  take 2 [1 2 3 4]  yields  [1 2] 
+  take = count: list:
+    if list == [] || count == 0 then []
+    else [ (head list) ] ++ take (builtins.sub count 1) (tail list);
+
 }
diff --git a/pkgs/lib/tests.nix b/pkgs/lib/tests.nix
index c5476cbc18c..9aa04f62360 100644
--- a/pkgs/lib/tests.nix
+++ b/pkgs/lib/tests.nix
@@ -61,6 +61,15 @@ runTests {
     expected = true;
   };
 
+  testTake = testAllTrue [
+    ([] == (take 0 [  1 2 3 ]))
+    ([1] == (take 1 [  1 2 3 ]))
+    ([ 1 2 ] == (take 2 [  1 2 3 ]))
+    ([ 1 2 3 ] == (take 3 [  1 2 3 ]))
+    ([ 1 2 3 ] == (take 4 [  1 2 3 ]))
+  ];
+
+
   testOverridableDelayableArgsTest = {
     expr = 
       let res1 = defaultOverridableDelayableArgs id {};