From fffcee35f9b2042d4edc5dccb3379972e03ffd84 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sat, 1 Apr 2017 15:34:38 -0400 Subject: [PATCH] lib: Fix `matchAttrs` --- lib/attrsets.nix | 13 +++++-------- 1 file 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]));