diff options
author | Silvan Mosberger <contact@infinisil.com> | 2024-04-04 22:03:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-04 22:03:53 +0200 |
commit | a448a21521c47f9c0579d6459f9eb61659a59376 (patch) | |
tree | 9f0c127e153c64812c14d64b6bb592956ec1a7c7 | |
parent | 53e51b19d48fb3e54b81c65caade88188d1cf31d (diff) | |
parent | 725bb4e48c6491598f53b83c2dcd1a307115c6cc (diff) |
Merge pull request #301556 from edef1c/lib-xor
lib: add xor
-rw-r--r-- | lib/default.nix | 2 | ||||
-rw-r--r-- | lib/tests/misc.nix | 16 | ||||
-rw-r--r-- | lib/trivial.nix | 18 | ||||
-rw-r--r-- | nixos/modules/config/users-groups.nix | 1 | ||||
-rw-r--r-- | nixos/modules/services/networking/kea.nix | 1 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/13/default.nix | 7 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/14/default.nix | 7 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/15/default.nix | 7 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/16/default.nix | 7 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/17/default.nix | 7 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/18/default.nix | 7 | ||||
-rw-r--r-- | pkgs/development/compilers/llvm/git/default.nix | 7 |
12 files changed, 49 insertions, 38 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 da5e322975096..accceb4ddf9c1 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 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); diff --git a/nixos/modules/config/users-groups.nix b/nixos/modules/config/users-groups.nix index f9750b7263cac..07d9591cb446b 100644 --- a/nixos/modules/config/users-groups.nix +++ b/nixos/modules/config/users-groups.nix @@ -871,7 +871,6 @@ in { } { assertion = let - xor = a: b: a && !b || b && !a; isEffectivelySystemUser = user.isSystemUser || (user.uid != null && user.uid < 1000); in xor isEffectivelySystemUser user.isNormalUser; message = '' diff --git a/nixos/modules/services/networking/kea.nix b/nixos/modules/services/networking/kea.nix index 656ddd41fd12b..5fd6427c90f86 100644 --- a/nixos/modules/services/networking/kea.nix +++ b/nixos/modules/services/networking/kea.nix @@ -9,7 +9,6 @@ with lib; let cfg = config.services.kea; - xor = x: y: (!x && y) || (x && !y); format = pkgs.formats.json {}; chooseNotNull = x: y: if x != null then x else y; diff --git a/pkgs/development/compilers/llvm/13/default.nix b/pkgs/development/compilers/llvm/13/default.nix index cd96231e62c35..429dfe5f1f3ee 100644 --- a/pkgs/development/compilers/llvm/13/default.nix +++ b/pkgs/development/compilers/llvm/13/default.nix @@ -42,12 +42,9 @@ }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + diff --git a/pkgs/development/compilers/llvm/14/default.nix b/pkgs/development/compilers/llvm/14/default.nix index 66f5c7385a150..6dcdcfa925840 100644 --- a/pkgs/development/compilers/llvm/14/default.nix +++ b/pkgs/development/compilers/llvm/14/default.nix @@ -41,12 +41,9 @@ , monorepoSrc ? null }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + diff --git a/pkgs/development/compilers/llvm/15/default.nix b/pkgs/development/compilers/llvm/15/default.nix index 0ccb9c449a8da..dcafd2970d005 100644 --- a/pkgs/development/compilers/llvm/15/default.nix +++ b/pkgs/development/compilers/llvm/15/default.nix @@ -41,12 +41,9 @@ , monorepoSrc ? null }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + diff --git a/pkgs/development/compilers/llvm/16/default.nix b/pkgs/development/compilers/llvm/16/default.nix index 66185071f22b7..46d17c193fc92 100644 --- a/pkgs/development/compilers/llvm/16/default.nix +++ b/pkgs/development/compilers/llvm/16/default.nix @@ -41,12 +41,9 @@ , monorepoSrc ? null }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + diff --git a/pkgs/development/compilers/llvm/17/default.nix b/pkgs/development/compilers/llvm/17/default.nix index c8d9569253450..fb3e967cc39b8 100644 --- a/pkgs/development/compilers/llvm/17/default.nix +++ b/pkgs/development/compilers/llvm/17/default.nix @@ -41,12 +41,9 @@ , monorepoSrc ? null }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + diff --git a/pkgs/development/compilers/llvm/18/default.nix b/pkgs/development/compilers/llvm/18/default.nix index dd3000c042594..ae1f4399cf2ed 100644 --- a/pkgs/development/compilers/llvm/18/default.nix +++ b/pkgs/development/compilers/llvm/18/default.nix @@ -41,12 +41,9 @@ , monorepoSrc ? null }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + diff --git a/pkgs/development/compilers/llvm/git/default.nix b/pkgs/development/compilers/llvm/git/default.nix index 80cff85372d06..bd21a75b8c2fc 100644 --- a/pkgs/development/compilers/llvm/git/default.nix +++ b/pkgs/development/compilers/llvm/git/default.nix @@ -46,12 +46,9 @@ , monorepoSrc ? null }: -assert let - int = a: if a then 1 else 0; - xor = a: b: ((builtins.bitXor (int a) (int b)) == 1); -in +assert lib.assertMsg - (xor + (lib.xor (gitRelease != null) (officialRelease != null)) ("must specify `gitRelease` or `officialRelease`" + |