Skip to content

Commit

Permalink
lib.dropEnd (NixOS#370558)
Browse files Browse the repository at this point in the history
  • Loading branch information
infinisil authored Jan 13, 2025
2 parents 0b4b131 + 782a0e6 commit 0f880eb
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,9 @@ let
inherit (self.lists) singleton forEach map foldr fold foldl foldl' imap0 imap1
filter ifilter0 concatMap flatten remove findSingle findFirst any all count
optional optionals toList range replicate partition zipListsWith zipLists
reverseList listDfs toposort sort sortOn naturalSort compareLists take
drop sublist last init crossLists unique allUnique intersectLists
reverseList listDfs toposort sort sortOn naturalSort compareLists
take drop dropEnd sublist last init
crossLists unique allUnique intersectLists
subtractLists mutuallyExclusive groupBy groupBy' concatLists genList
length head tail elem elemAt isList;
inherit (self.strings) concatStrings concatMapStrings concatImapStrings
Expand Down
41 changes: 41 additions & 0 deletions lib/lists.nix
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ let
inherit (lib.strings) toInt;
inherit (lib.trivial) compare min id warn pipe;
inherit (lib.attrsets) mapAttrs;
inherit (lib) max;
in
rec {

Expand Down Expand Up @@ -1497,6 +1498,46 @@ rec {
count:
list: sublist count (length list) list;

/**
Remove the last (at most) N elements of a list.
# Inputs
`count`
: Number of elements to drop
`list`
: Input list
# Type
```
dropEnd :: Int -> [a] -> [a]
```
# Examples
:::{.example}
## `lib.lists.dropEnd` usage example
```nix
dropEnd 2 [ "a" "b" "c" "d" ]
=> [ "a" "b" ]
dropEnd 2 [ ]
=> [ ]
```
:::
*/
dropEnd =
n: xs:
take
(max 0 (length xs - n))
xs;

/**
Whether the first list is a prefix of the second list.
Expand Down
24 changes: 24 additions & 0 deletions lib/tests/misc.nix
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,30 @@ runTests {
([ 1 2 3 ] == (take 4 [ 1 2 3 ]))
];

testDrop = let inherit (lib) drop; in testAllTrue [
# list index -1 is out of bounds
# ([ 1 2 3 ] == (drop (-1) [ 1 2 3 ]))
(drop 0 [ 1 2 3 ] == [ 1 2 3 ])
(drop 1 [ 1 2 3 ] == [ 2 3 ])
(drop 2 [ 1 2 3 ] == [ 3 ])
(drop 3 [ 1 2 3 ] == [ ])
(drop 4 [ 1 2 3 ] == [ ])
(drop 0 [ ] == [ ])
(drop 1 [ ] == [ ])
];

testDropEnd = let inherit (lib) dropEnd; in testAllTrue [
(dropEnd 0 [ 1 2 3 ] == [ 1 2 3 ])
(dropEnd 1 [ 1 2 3 ] == [ 1 2 ])
(dropEnd 2 [ 1 2 3 ] == [ 1 ])
(dropEnd 3 [ 1 2 3 ] == [ ])
(dropEnd 4 [ 1 2 3 ] == [ ])
(dropEnd 0 [ ] == [ ])
(dropEnd 1 [ ] == [ ])
(dropEnd (-1) [ 1 2 3 ] == [ 1 2 3 ])
(dropEnd (-1) [ ] == [ ])
];

testListHasPrefixExample1 = {
expr = lists.hasPrefix [ 1 2 ] [ 1 2 3 4 ];
expected = true;
Expand Down

0 comments on commit 0f880eb

Please sign in to comment.