summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2024-04-04 22:03:53 +0200
committerGitHub <noreply@github.com>2024-04-04 22:03:53 +0200
commita448a21521c47f9c0579d6459f9eb61659a59376 (patch)
tree9f0c127e153c64812c14d64b6bb592956ec1a7c7 /lib
parent53e51b19d48fb3e54b81c65caade88188d1cf31d (diff)
parent725bb4e48c6491598f53b83c2dcd1a307115c6cc (diff)
Merge pull request #301556 from edef1c/lib-xor
lib: add xor
Diffstat (limited to 'lib')
-rw-r--r--lib/default.nix2
-rw-r--r--lib/tests/misc.nix16
-rw-r--r--lib/trivial.nix18
3 files changed, 35 insertions, 1 deletions
diff --git a/lib/default.nix b/lib/default.nix
index f6cb7932507a..b442ddf5fa0f 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -69,7 +69,7 @@ let
hasAttr head isAttrs isBool isInt isList isPath isString length
lessThan listToAttrs pathExists readFile replaceStrings seq
stringLength sub substring tail trace;
- inherit (self.trivial) id const pipe concat or and bitAnd bitOr bitXor
+ inherit (self.trivial) id const pipe concat or and xor bitAnd bitOr bitXor
bitNot boolToString mergeAttrs flip mapNullable inNixShell isFloat min max
importJSON importTOML warn warnIf warnIfNot throwIf throwIfNot checkListOfEnum
info showWarnings nixpkgsVersion version isInOldestRelease
diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix
index da5e32297509..accceb4ddf9c 100644
--- a/lib/tests/misc.nix
+++ b/lib/tests/misc.nix
@@ -106,6 +106,7 @@ let
types
updateManyAttrsByPath
versions
+ xor
;
testingThrow = expr: {
@@ -214,6 +215,21 @@ runTests {
expected = false;
};
+ testXor = {
+ expr = [
+ (xor true false)
+ (xor true true)
+ (xor false false)
+ (xor false true)
+ ];
+ expected = [
+ true
+ false
+ false
+ true
+ ];
+ };
+
testFix = {
expr = fix (x: {a = if x ? a then "a" else "b";});
expected = {a = "a";};
diff --git a/lib/trivial.nix b/lib/trivial.nix
index 936ad207c03d..5b7a1ee30f7a 100644
--- a/lib/trivial.nix
+++ b/lib/trivial.nix
@@ -200,6 +200,24 @@ in {
and = x: y: x && y;
/**
+ boolean “exclusive or”
+
+
+ # Inputs
+
+ `x`
+
+ : 1\. Function argument
+
+ `y`
+
+ : 2\. Function argument
+ */
+ # We explicitly invert the arguments purely as a type assertion.
+ # This is invariant under XOR, so it does not affect the result.
+ xor = x: y: (!x) != (!y);
+
+ /**
bitwise “not”
*/
bitNot = builtins.sub (-1);