// Path: src/main/com/olabini/jescov/CoverageData.java
// public class CoverageData {
//     private final Map<String, FileCoverage> fileCoverage;
// 
//     public CoverageData(List<FileCoverage> fileCoverage) {
//         this.fileCoverage = new TreeMap<String, FileCoverage>();
//         for(FileCoverage fc : fileCoverage) {
//             this.fileCoverage.put(fc.getFilename(), fc);
//         }
//     }
// 
//     public FileCoverage getFileCoverageFor(String filename) {
//         return fileCoverage.get(filename);
//     }
// 
//     public Collection<String> getFileNames() {
//         return fileCoverage.keySet();
//     }
// 
//     public int getLinesValid() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getLinesValid();
//         }
//         return sum;
//     }
// 
//     public int getBranchesValid() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getBranchesValid();
//         }
//         return sum;
//     }
// 
//     public int getLinesCovered() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getLinesCovered();
//         }
//         return sum;
//     }
// 
//     public int getBranchesCovered() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getBranchesCovered();
//         }
//         return sum;
//     }
// 
//     public double getLineRate() {
//         return getLinesCovered() / (double)getLinesValid();
//     }
// 
//     public double getBranchRate() {
//         return getBranchesCovered() / (double)getBranchesValid();
//     }
// 
//     public CoverageData plus(CoverageData other) {
//         List<FileCoverage> fcs = new ArrayList<FileCoverage>();
//         Set<String> files = new HashSet<String>();
//         files.addAll(this.getFileNames());
//         files.addAll(other.getFileNames());
//         for(String file : files) {
//             FileCoverage left = this.getFileCoverageFor(file);
//             FileCoverage right = other.getFileCoverageFor(file);
// 
//             if(left == null || right == null) {
//                 if(left == null) {
//                     fcs.add(right);
//                 } else {
//                     fcs.add(left);
//                 }
//             } else {
//                 fcs.add(left.plus(right));
//             }
//         }
// 
//         return new CoverageData(fcs);
//     }
// }


import java.io.IOException;
import com.olabini.jescov.CoverageData;
import java.util.List;
import static java.util.Arrays.asList;
/*
 * See LICENSE file in distribution for copyright and licensing information.
 */
package com.olabini.jescov.generators;




public class CombinedGenerator implements Generator {
    private final List<Generator> generators;
    public CombinedGenerator(Generator... generators) {
        this.generators = asList(generators);
    }

// Path: src/main/com/olabini/jescov/CoverageData.java
// public class CoverageData {
//     private final Map<String, FileCoverage> fileCoverage;
// 
//     public CoverageData(List<FileCoverage> fileCoverage) {
//         this.fileCoverage = new TreeMap<String, FileCoverage>();
//         for(FileCoverage fc : fileCoverage) {
//             this.fileCoverage.put(fc.getFilename(), fc);
//         }
//     }
// 
//     public FileCoverage getFileCoverageFor(String filename) {
//         return fileCoverage.get(filename);
//     }
// 
//     public Collection<String> getFileNames() {
//         return fileCoverage.keySet();
//     }
// 
//     public int getLinesValid() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getLinesValid();
//         }
//         return sum;
//     }
// 
//     public int getBranchesValid() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getBranchesValid();
//         }
//         return sum;
//     }
// 
//     public int getLinesCovered() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getLinesCovered();
//         }
//         return sum;
//     }
// 
//     public int getBranchesCovered() {
//         int sum = 0;
//         for(FileCoverage fc : fileCoverage.values()) {
//             sum += fc.getBranchesCovered();
//         }
//         return sum;
//     }
// 
//     public double getLineRate() {
//         return getLinesCovered() / (double)getLinesValid();
//     }
// 
//     public double getBranchRate() {
//         return getBranchesCovered() / (double)getBranchesValid();
//     }
// 
//     public CoverageData plus(CoverageData other) {
//         List<FileCoverage> fcs = new ArrayList<FileCoverage>();
//         Set<String> files = new HashSet<String>();
//         files.addAll(this.getFileNames());
//         files.addAll(other.getFileNames());
//         for(String file : files) {
//             FileCoverage left = this.getFileCoverageFor(file);
//             FileCoverage right = other.getFileCoverageFor(file);
// 
//             if(left == null || right == null) {
//                 if(left == null) {
//                     fcs.add(right);
//                 } else {
//                     fcs.add(left);
//                 }
//             } else {
//                 fcs.add(left.plus(right));
//             }
//         }
// 
//         return new CoverageData(fcs);
//     }
// }


// Path: src/main/com/olabini/jescov/generators/CombinedGenerator.java
import java.io.IOException;
import com.olabini.jescov.CoverageData;
import java.util.List;
import static java.util.Arrays.asList;

/*
 * See LICENSE file in distribution for copyright and licensing information.
 */
package com.olabini.jescov.generators;




public class CombinedGenerator implements Generator {
    private final List<Generator> generators;
    public CombinedGenerator(Generator... generators) {
        this.generators = asList(generators);
    }

    public void generate(CoverageData data) throws IOException {