anchor.diff:            .toSet();
   
     /// Runs [builder] with [primaryInputs] as inputs.
  -  Stream<AssetId> _runBuilder(int phaseNumber, Builder builder,
  -      Iterable<AssetId> primaryInputs, ResourceManager resourceManager) {
  -    var streamController = new StreamController<AssetId>();
  +  Future<Iterable<AssetId>> _runBuilder(int phaseNumber, Builder builder,
  +      Iterable<AssetId> primaryInputs, ResourceManager resourceManager) async {
  +    var outputs = <AssetId>[];
  +
       Future runForInput(AssetId input) async {
         var builderOutputs = expectedOutputs(builder, input);
   
  
positive.code:       // Yield the outputs.
        for (var output in wrappedWriter.assetsWritten) {
          (_assetGraph.get(output) as GeneratedAssetNode).wasOutput = true;
          streamController.add(output);
        }
      }
  
      Future.wait(primaryInputs.map(runForInput)).then((_) {
        streamController.close();
      });
  
      return streamController.stream;
    }
  
    Future _delete(AssetId id) {
  
negative.code:     for (var action in _buildActions) {
        phaseNumber++;
        var inputs = _matchingInputs(action.inputSet, phaseNumber);
        for (var output in await _runBuilder(
            phaseNumber, action.builder, inputs, resourceManager)) {
          outputs.add(output);
        }
  