lib.dropEnd: init
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
This commit is contained in:
@@ -94,8 +94,9 @@ let
|
|||||||
inherit (self.lists) singleton forEach map foldr fold foldl foldl' imap0 imap1
|
inherit (self.lists) singleton forEach map foldr fold foldl foldl' imap0 imap1
|
||||||
filter ifilter0 concatMap flatten remove findSingle findFirst any all count
|
filter ifilter0 concatMap flatten remove findSingle findFirst any all count
|
||||||
optional optionals toList range replicate partition zipListsWith zipLists
|
optional optionals toList range replicate partition zipListsWith zipLists
|
||||||
reverseList listDfs toposort sort sortOn naturalSort compareLists take
|
reverseList listDfs toposort sort sortOn naturalSort compareLists
|
||||||
drop sublist last init crossLists unique allUnique intersectLists
|
take drop dropEnd sublist last init
|
||||||
|
crossLists unique allUnique intersectLists
|
||||||
subtractLists mutuallyExclusive groupBy groupBy' concatLists genList
|
subtractLists mutuallyExclusive groupBy groupBy' concatLists genList
|
||||||
length head tail elem elemAt isList;
|
length head tail elem elemAt isList;
|
||||||
inherit (self.strings) concatStrings concatMapStrings concatImapStrings
|
inherit (self.strings) concatStrings concatMapStrings concatImapStrings
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ let
|
|||||||
inherit (lib.strings) toInt;
|
inherit (lib.strings) toInt;
|
||||||
inherit (lib.trivial) compare min id warn pipe;
|
inherit (lib.trivial) compare min id warn pipe;
|
||||||
inherit (lib.attrsets) mapAttrs;
|
inherit (lib.attrsets) mapAttrs;
|
||||||
|
inherit (lib) max;
|
||||||
in
|
in
|
||||||
rec {
|
rec {
|
||||||
|
|
||||||
@@ -1484,6 +1485,46 @@ rec {
|
|||||||
count:
|
count:
|
||||||
list: sublist count (length list) list;
|
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.
|
Whether the first list is a prefix of the second list.
|
||||||
|
|
||||||
|
|||||||
@@ -866,6 +866,18 @@ runTests {
|
|||||||
(drop 1 [ ] == [ ])
|
(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 = {
|
testListHasPrefixExample1 = {
|
||||||
expr = lists.hasPrefix [ 1 2 ] [ 1 2 3 4 ];
|
expr = lists.hasPrefix [ 1 2 ] [ 1 2 3 4 ];
|
||||||
expected = true;
|
expected = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user