Skip to content

Commit

Permalink
lib.dropEnd: init
Browse files Browse the repository at this point in the history
Naming borrowed from Haskell
- `base`: [`dropWhileEnd`]
- `extra`, `mono-traversable`, ...: [`dropEnd`]

[`dropEnd`]: https://hackage.haskell.org/package/mono-traversable-1.0.21.0/docs/Data-Sequences.html#v:dropEnd
[`dropWhileEnd`]: https://hackage.haskell.org/package/base-4.21.0.0/docs/Data-List.html#v:dropWhileEnd
  • Loading branch information
roberth committed Jan 3, 2025
1 parent c96e907 commit 782a0e6
Show file tree
Hide file tree
Showing 3 changed files with 56 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 @@ -1484,6 +1485,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
12 changes: 12 additions & 0 deletions lib/tests/misc.nix
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,18 @@ runTests {
(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 782a0e6

Please sign in to comment.