diff options
author | John Ericson <Ericson2314@Yahoo.com> | 2017-04-01 15:34:38 -0400 |
---|---|---|
committer | John Ericson <Ericson2314@Yahoo.com> | 2017-04-17 17:13:01 -0400 |
commit | fffcee35f9b2042d4edc5dccb3379972e03ffd84 (patch) | |
tree | 2e8c2fb8599d0fb46b57a727a3d33e3c51d9bc49 | |
parent | 22277893923cdf26004d83b608b7e1c3ca7030fb (diff) |
lib: Fix `matchAttrs`
-rw-r--r-- | lib/attrsets.nix | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/lib/attrsets.nix b/lib/attrsets.nix index f9e6b7495fc5..c686e1d20eb8 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -2,7 +2,7 @@ let inherit (builtins) head tail length; - inherit (import ./trivial.nix) or; + inherit (import ./trivial.nix) and or; inherit (import ./default.nix) fold; inherit (import ./strings.nix) concatStringsSep; inherit (import ./lists.nix) concatMap concatLists all deepSeqList; @@ -417,18 +417,15 @@ rec { /* Returns true if the pattern is contained in the set. False otherwise. - FIXME(zimbatm): this example doesn't work !!! - Example: - sys = mkSystem { } - matchAttrs { cpu = { bits = 64; }; } sys + matchAttrs { cpu = {}; } { cpu = { bits = 64; }; } => true */ - matchAttrs = pattern: attrs: - fold or false (attrValues (zipAttrsWithNames (attrNames pattern) (n: values: + matchAttrs = pattern: attrs: assert isAttrs pattern; + fold and true (attrValues (zipAttrsWithNames (attrNames pattern) (n: values: let pat = head values; val = head (tail values); in if length values == 1 then false - else if isAttrs pat then isAttrs val && matchAttrs head values + else if isAttrs pat then isAttrs val && matchAttrs pat val else pat == val ) [pattern attrs])); |