mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-12 04:35:41 +03:00
lib.lists.commonPrefix: init
This commit is contained in:
parent
53dcfd24ad
commit
7f61b01600
2 changed files with 60 additions and 1 deletions
|
@ -3,7 +3,7 @@
|
|||
{ lib }:
|
||||
let
|
||||
inherit (lib.strings) toInt;
|
||||
inherit (lib.trivial) compare min;
|
||||
inherit (lib.trivial) compare min id;
|
||||
inherit (lib.attrsets) mapAttrs;
|
||||
in
|
||||
rec {
|
||||
|
@ -663,6 +663,32 @@ rec {
|
|||
else if start + count > len then len - start
|
||||
else count);
|
||||
|
||||
/* The common prefix of two lists.
|
||||
|
||||
Type: commonPrefix :: [a] -> [a] -> [a]
|
||||
|
||||
Example:
|
||||
commonPrefix [ 1 2 3 4 5 6 ] [ 1 2 4 8 ]
|
||||
=> [ 1 2 ]
|
||||
commonPrefix [ 1 2 3 ] [ 1 2 3 4 5 ]
|
||||
=> [ 1 2 3 ]
|
||||
commonPrefix [ 1 2 3 ] [ 4 5 6 ]
|
||||
=> [ ]
|
||||
*/
|
||||
commonPrefix =
|
||||
list1:
|
||||
list2:
|
||||
let
|
||||
# Zip the lists together into a list of booleans whether each element matches
|
||||
matchings = zipListsWith (fst: snd: fst != snd) list1 list2;
|
||||
# Find the first index where the elements don't match,
|
||||
# which will then also be the length of the common prefix.
|
||||
# If all elements match, we fall back to the length of the zipped list,
|
||||
# which is the same as the length of the smaller list.
|
||||
commonPrefixLength = findFirstIndex id (length matchings) matchings;
|
||||
in
|
||||
take commonPrefixLength list1;
|
||||
|
||||
/* Return the last element of a list.
|
||||
|
||||
This function throws an error if the list is empty.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue