diff options
Diffstat (limited to 'nix/tag')
-rw-r--r-- | nix/tag/default.nix | 84 | ||||
-rw-r--r-- | nix/tag/tests.nix | 44 |
2 files changed, 69 insertions, 59 deletions
diff --git a/nix/tag/default.nix b/nix/tag/default.nix index 9c55e6263b39..0038404460b1 100644 --- a/nix/tag/default.nix +++ b/nix/tag/default.nix @@ -4,22 +4,24 @@ let # if so sets `isTag` to `true` and sets the name and value. # If not, sets `isTag` to `false` and sets `errmsg`. verifyTag = tag: - let cases = builtins.attrNames tag; - len = builtins.length cases; + let + cases = builtins.attrNames tag; + len = builtins.length cases; in if builtins.length cases == 1 - then let name = builtins.head cases; in { - isTag = true; - name = name; - val = tag.${name}; - errmsg = null; - } + then + let name = builtins.head cases; in { + isTag = true; + name = name; + val = tag.${name}; + errmsg = null; + } else { isTag = false; errmsg = - ( "match: an instance of a sum is an attrset " - + "with exactly one element, yours had ${toString len}" - + ", namely: ${lib.generators.toPretty {} cases}" ); + ("match: an instance of a sum is an attrset " + + "with exactly one element, yours had ${toString len}" + + ", namely: ${lib.generators.toPretty {} cases}"); name = null; val = null; }; @@ -63,21 +65,22 @@ let # ] 1 # => { smol = 1; } discrDef = defTag: fs: v: - let res = lib.findFirst - (t: t.val v) - null - (map assertIsTag fs); + let + res = lib.findFirst + (t: t.val v) + null + (map assertIsTag fs); in - if res == null - then { ${defTag} = v; } - else { ${res.name} = v; }; + if res == null + then { ${defTag} = v; } + else { ${res.name} = v; }; # Like `discrDef`, but fail if there is no match. discr = fs: v: let res = discrDef null fs v; in - assert lib.assertMsg (res != null) - "tag.discr: No predicate found that matches ${lib.generators.toPretty {} v}"; - res; + assert lib.assertMsg (res != null) + "tag.discr: No predicate found that matches ${lib.generators.toPretty {} v}"; + res; # The canonical pattern matching primitive. # A sum value is an attribute set with one element, @@ -104,17 +107,17 @@ let match = sum: matcher: let cases = builtins.attrNames sum; in assert - let len = builtins.length cases; in - lib.assertMsg (len == 1) - ( "match: an instance of a sum is an attrset " - + "with exactly one element, yours had ${toString len}" - + ", namely: ${lib.generators.toPretty {} cases}" ); + let len = builtins.length cases; in + lib.assertMsg (len == 1) + ("match: an instance of a sum is an attrset " + + "with exactly one element, yours had ${toString len}" + + ", namely: ${lib.generators.toPretty {} cases}"); let case = builtins.head cases; in assert - lib.assertMsg (matcher ? ${case}) - ( "match: \"${case}\" is not a valid case of this sum, " + lib.assertMsg (matcher ? ${case}) + ("match: \"${case}\" is not a valid case of this sum, " + "the matcher accepts: ${lib.generators.toPretty {} - (builtins.attrNames matcher)}" ); + (builtins.attrNames matcher)}"); matcher.${case} sum.${case}; # A `match` with the arguments flipped. @@ -148,15 +151,16 @@ let ; }; -in { - inherit - verifyTag - tagName - tagValue - discr - discrDef - match - matchLam - tests - ; +in +{ + inherit + verifyTag + tagName + tagValue + discr + discrDef + match + matchLam + tests + ; } diff --git a/nix/tag/tests.nix b/nix/tag/tests.nix index 8c9c73807472..bcc42c758a6c 100644 --- a/nix/tag/tests.nix +++ b/nix/tag/tests.nix @@ -17,7 +17,7 @@ let errmsg = null; }) (assertEq "is not Tag" - (removeAttrs (verifyTag { foo = "bar"; baz = 42; }) ["errmsg"]) + (removeAttrs (verifyTag { foo = "bar"; baz = 42; }) [ "errmsg" ]) { isTag = false; name = null; @@ -41,7 +41,8 @@ let (discr [ { bool = lib.isBool; } { int = lib.isInt; } - ] true) + ] + true) { bool = true; }) (assertEq "fallback to default" (discrDef "def" [ @@ -53,19 +54,24 @@ let match-test = it "can match things" [ (assertEq "match example" - (let - success = { res = 42; }; - failure = { err = "no answer"; }; - matcher = { - res = i: i + 1; - err = _: 0; - }; - in { - one = match success matcher; - two = match failure matcher; + ( + let + success = { res = 42; }; + failure = { err = "no answer"; }; + matcher = { + res = i: i + 1; + err = _: 0; + }; + in + { + one = match success matcher; + two = match failure matcher; + } + ) + { + one = 43; + two = 0; }) - { one = 43; - two = 0; }) (assertEq "matchLam & pipe" (lib.pipe { foo = 42; } [ (matchLam { @@ -81,8 +87,8 @@ let ]; in - runTestsuite "tag" [ - isTag-test - discr-test - match-test - ] +runTestsuite "tag" [ + isTag-test + discr-test + match-test +] |