forked from mirrors/nixpkgs
lib: implement compare
, splitByAndCompare
, and compareLists
This commit is contained in:
parent
aeb32cf187
commit
bccab965b9
|
@ -56,7 +56,7 @@ let
|
||||||
replaceStrings seq stringLength sub substring tail;
|
replaceStrings seq stringLength sub substring tail;
|
||||||
inherit (trivial) id const concat or and boolToString mergeAttrs
|
inherit (trivial) id const concat or and boolToString mergeAttrs
|
||||||
flip mapNullable inNixShell min max importJSON warn info
|
flip mapNullable inNixShell min max importJSON warn info
|
||||||
nixpkgsVersion mod;
|
nixpkgsVersion mod compare splitByAndCompare;
|
||||||
|
|
||||||
inherit (fixedPoints) fix fix' extends composeExtensions
|
inherit (fixedPoints) fix fix' extends composeExtensions
|
||||||
makeExtensible makeExtensibleWithCustomName;
|
makeExtensible makeExtensibleWithCustomName;
|
||||||
|
@ -71,8 +71,8 @@ let
|
||||||
inherit (lists) singleton foldr fold foldl foldl' imap0 imap1
|
inherit (lists) singleton foldr fold foldl foldl' imap0 imap1
|
||||||
concatMap flatten remove findSingle findFirst any all count
|
concatMap flatten remove findSingle findFirst any all count
|
||||||
optional optionals toList range partition zipListsWith zipLists
|
optional optionals toList range partition zipListsWith zipLists
|
||||||
reverseList listDfs toposort sort take drop sublist last init
|
reverseList listDfs toposort sort compareLists take drop sublist
|
||||||
crossLists unique intersectLists subtractLists
|
last init crossLists unique intersectLists subtractLists
|
||||||
mutuallyExclusive;
|
mutuallyExclusive;
|
||||||
inherit (strings) concatStrings concatMapStrings concatImapStrings
|
inherit (strings) concatStrings concatMapStrings concatImapStrings
|
||||||
intersperse concatStringsSep concatMapStringsSep
|
intersperse concatStringsSep concatMapStringsSep
|
||||||
|
|
|
@ -385,6 +385,30 @@ rec {
|
||||||
if len < 2 then list
|
if len < 2 then list
|
||||||
else (sort strictLess pivot.left) ++ [ first ] ++ (sort strictLess pivot.right));
|
else (sort strictLess pivot.left) ++ [ first ] ++ (sort strictLess pivot.right));
|
||||||
|
|
||||||
|
/* Compare two lists element-by-element.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
compareLists compare [] []
|
||||||
|
=> 0
|
||||||
|
compareLists compare [] [ "a" ]
|
||||||
|
=> -1
|
||||||
|
compareLists compare [ "a" ] []
|
||||||
|
=> 1
|
||||||
|
compareLists compare [ "a" "b" ] [ "a" "c" ]
|
||||||
|
=> 1
|
||||||
|
*/
|
||||||
|
compareLists = cmp: a: b:
|
||||||
|
if a == []
|
||||||
|
then if b == []
|
||||||
|
then 0
|
||||||
|
else -1
|
||||||
|
else if b == []
|
||||||
|
then 1
|
||||||
|
else let rel = cmp (head a) (head b); in
|
||||||
|
if rel == 0
|
||||||
|
then compareLists cmp (tail a) (tail b)
|
||||||
|
else rel;
|
||||||
|
|
||||||
/* Return the first (at most) N elements of a list.
|
/* Return the first (at most) N elements of a list.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
|
@ -81,6 +81,31 @@ rec {
|
||||||
*/
|
*/
|
||||||
mod = base: int: base - (int * (builtins.div base int));
|
mod = base: int: base - (int * (builtins.div base int));
|
||||||
|
|
||||||
|
/* C-style comparisons
|
||||||
|
|
||||||
|
a < b => -1
|
||||||
|
a == b => 0
|
||||||
|
a > b => 1
|
||||||
|
*/
|
||||||
|
compare = a: b:
|
||||||
|
if a < b
|
||||||
|
then -1
|
||||||
|
else if a > b
|
||||||
|
then 1
|
||||||
|
else 0;
|
||||||
|
|
||||||
|
/* Split type into two subtypes by predicate `p`, assume
|
||||||
|
|
||||||
|
forall x y . x < y if p x == true && p y == false
|
||||||
|
|
||||||
|
compare elements of the same subtype with `yes` and `no`
|
||||||
|
comparisons respectively.
|
||||||
|
*/
|
||||||
|
splitByAndCompare = p: yes: no: a: b:
|
||||||
|
if p a
|
||||||
|
then if p b then yes a b else -1
|
||||||
|
else if p b then 1 else no a b;
|
||||||
|
|
||||||
/* Reads a JSON file. */
|
/* Reads a JSON file. */
|
||||||
importJSON = path:
|
importJSON = path:
|
||||||
builtins.fromJSON (builtins.readFile path);
|
builtins.fromJSON (builtins.readFile path);
|
||||||
|
|
Loading…
Reference in a new issue