diff options
author | edef <edef@edef.eu> | 2024-04-04 14:05:18 +0000 |
---|---|---|
committer | edef <edef@edef.eu> | 2024-04-04 19:46:58 +0000 |
commit | 725bb4e48c6491598f53b83c2dcd1a307115c6cc (patch) | |
tree | 5e801c1cd8677cefd283e63ec3d0fc5484df98d4 /lib | |
parent | d03a4482228d4d6dbd2d4b425b6dfcd49ebe765f (diff) |
lib: add xor
This gets clumsily reimplemented in various places, to no useful end.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/default.nix | 2 | ||||
-rw-r--r-- | lib/tests/misc.nix | 16 | ||||
-rw-r--r-- | lib/trivial.nix | 18 |
3 files changed, 35 insertions, 1 deletions
diff --git a/lib/default.nix b/lib/default.nix index f6cb7932507a9..b442ddf5fa0f0 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 3cb96c1b68bc2..9d2da7a639130 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -102,6 +102,7 @@ let types updateManyAttrsByPath versions + xor ; testingThrow = expr: { @@ -210,6 +211,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 936ad207c03df..5b7a1ee30f7ad 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); |