summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorSilvan Mosberger <silvan.mosberger@tweag.io>2023-07-14 18:28:38 +0200
committerSilvan Mosberger <silvan.mosberger@tweag.io>2023-07-14 19:36:46 +0200
commit9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54 (patch)
treed0d0b4e3fb927d00bc43a29ae4fee3d41388b3bf /lib
parentbc8fbc25723b05e0f909faa6589641867200775b (diff)
downloadnixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.tar
nixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.tar.gz
nixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.tar.bz2
nixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.tar.lz
nixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.tar.xz
nixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.tar.zst
nixpkgs-9fdc0bb2bfa2d1dd631bb39f3b9e7cfec16bcd54.zip
lib.lists.removePrefix: init
Diffstat (limited to 'lib')
-rw-r--r--lib/lists.nix19
-rw-r--r--lib/tests/misc.nix17
2 files changed, 36 insertions, 0 deletions
diff --git a/lib/lists.nix b/lib/lists.nix
index e12bc9048ef..c9821819821 100644
--- a/lib/lists.nix
+++ b/lib/lists.nix
@@ -627,6 +627,25 @@ rec {
     list2:
     take (length list1) list2 == list1;
 
+  /* Remove the first list as a prefix from the second list.
+  Error if the first list isn't a prefix of the second list.
+
+  Type: removePrefix :: [a] -> [a] -> [a]
+
+  Example:
+    removePrefix [ 1 2 ] [ 1 2 3 4 ]
+    => [ 3 4 ]
+    removePrefix [ 0 1 ] [ 1 2 3 4 ]
+    => <error>
+  */
+  removePrefix =
+    list1:
+    list2:
+    if hasPrefix list1 list2 then
+      drop (length list1) list2
+    else
+      throw "lib.lists.removePrefix: First argument is not a list prefix of the second argument";
+
   /* Return a list consisting of at most `count` elements of `list`,
      starting at index `start`.
 
diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix
index 5c824a066e1..4f7035a53f5 100644
--- a/lib/tests/misc.nix
+++ b/lib/tests/misc.nix
@@ -501,6 +501,23 @@ runTests {
     expected = false;
   };
 
+  testListRemovePrefixExample1 = {
+    expr = lists.removePrefix [ 1 2 ] [ 1 2 3 4 ];
+    expected = [ 3 4 ];
+  };
+  testListRemovePrefixExample2 = {
+    expr = (builtins.tryEval (lists.removePrefix [ 0 1 ] [ 1 2 3 4 ])).success;
+    expected = false;
+  };
+  testListRemovePrefixEmptyPrefix = {
+    expr = lists.removePrefix [ ] [ 1 2 ];
+    expected = [ 1 2 ];
+  };
+  testListRemovePrefixEmptyList = {
+    expr = (builtins.tryEval (lists.removePrefix [ 1 2 ] [ ])).success;
+    expected = false;
+  };
+
   testFoldAttrs = {
     expr = foldAttrs (n: a: [n] ++ a) [] [
     { a = 2; b = 7; }