anchor.diff:      try {
         PerformanceLogSection analysisSection = null;
         while (true) {
  +        await _hasWork.signal;
  +
           // TODO(scheglov) implement state transitioning
  -        await _hasWork.signal;
  -
           if (analysisSection == null) {
             analysisSection = _logger.enter('Analyzing');
           }
   
  -        // TODO(scheglov) verify one file at a time
  -        _verifyUnlinkedSignatureOfChangedFiles();
  +        // Verify all changed files one at a time.
  +        if (_changedFiles.isNotEmpty) {
  +          String path = _removeFirst(_changedFiles);
  +          _verifyApiSignatureOfChangedFile(path);
  +          // Repeat the processing loop.
  +          _hasWork.notify();
  +          continue;
  +        }
   
           // Analyze the first file in the general queue.
           if (_filesToAnalyze.isNotEmpty) {
  -          String path = _filesToAnalyze.first;
  -          _filesToAnalyze.remove(path);
  +          String path = _removeFirst(_filesToAnalyze);
             _File file = _fileForPath(path);
             AnalysisResult result = _computeAnalysisResult(file);
             yield result;
  +          // Repeat the processing loop.
  +          _hasWork.notify();
  +          continue;
           }
   
  -        // If there is work to do, notify the monitor.
  -        if (_filesToAnalyze.isNotEmpty) {
  -          _hasWork.notify();
  -        } else {
  -          analysisSection.exit();
  -          analysisSection = null;
  -        }
  +        // There is nothing to do.
  +        analysisSection.exit();
  +        analysisSection = null;
         }
         // TODO(scheglov) implement
       } finally {
  
positive.code:    * [changeFile] invocation.
     */
    void changeFile(String path) {
      _filesToVerifyUnlinkedSignature.add(path);
      _filesToAnalyze.add(path);
      _hasWork.notify();
    }
  
negative.code:   final _explicitFiles = new LinkedHashSet<String>();
  
    /**
     * The set of files were reported as changed through [changeFile] and not
     * checked for actual changes yet.
     */
    final _changedFiles = new LinkedHashSet<String>();
  
    /**
     * The set of files that are currently scheduled for analysis.
  