anchor.diff:        });
       }
   
  -    return collectValues(_n).then((description) {
  -      if (description != null) return description;
  +    return collectValues(_n).then((failure) {
  +      if (failure != null) return failure;
         var matchState = {};
         if (_matcher.matches(collectedValues, matchState)) return null;
         return _matcher.describeMismatch(collectedValues, new StringDescription(),
  
positive.code:     return Future.wait([
        _matcher1.tryMatch(stream1).whenComplete(stream1.close),
        _matcher2.tryMatch(stream2).whenComplete(stream2.close)
      ]).then((descriptions) {
        var description1 = descriptions.first;
        var description2 = descriptions.last;
  
        // If both matchers matched, use the one that consumed more of the stream.
        if (description1 == null && description2 == null) {
          if (stream1.emittedValues.length >= stream2.emittedValues.length) {
            return _matcher1.tryMatch(stream);
          } else {
            return _matcher2.tryMatch(stream);
          }
        } else if (description1 == null) {
          return _matcher1.tryMatch(stream);
        } else if (description2 == null) {
          return _matcher2.tryMatch(stream);
        } else {
          return new StringDescription('both\n')
              .add(prefixLines(description1.toString(), prefix: '  '))
              .add('\nand\n')
              .add(prefixLines(description2.toString(), prefix: '  '))
              .toString();
        }
      });
  
negative.code: 
          var fork = stream.fork();
          return _matcher.tryMatch(fork).whenComplete(fork.close)
              .then((failure) {
            if (failure != null) {
              return stream.next().then((_) => consumeNext());
            }
  
  