srecord noeq Zip2Zip(File inZip, ZipOutputStream outZip) { IPred predicate; File outFile; bool ourOutputStream; *(File *inZip, File *outFile) { ourOutputStream = true; } *(File *inZip, ZipOutputStream *outZip, IPred *predicate) {} run { if (outFile != null && outZip == null) { outZip = zipOutputStream(outFile); set ourOutputStream; } temp ourOutputStream ? outZip : null; temp ZipFile zipFile = new(inZip); for (e : enumerationToIterator(zipFile.entries())) { S name = e.getName(); print("Copying " + name); ZipEntry e2 = new(name); continue unless predicate == null || predicate.get(name); e2.setSize(e.getSize()); outZip.putNextEntry(e2); temp var in = zipFile.getInputStream(e); copyFileContents(e.getName(), in, outZip); } } swappable void copyFileContents(S fileName, InputStream in, OutputStream out) { copyStream(in, out); } }