interface CompressionRegime { byte[] decompressorToBytes(A decompressor); A decompressorFromBytes(byte[] compressed); // return byte array, byte list or byte iterator O runDecompressor(A a); default O runDecompressorToBytes(A a) { ret toByteArray(runDecompressor(a)); } default byte[] decompress(byte[] compressed) { ret toByteArray(runDecompressor(decompressorFromBytes(compressed))); } default L decompressToByteList(byte[] compressed) { ret toByteList(runDecompressor(decompressorFromBytes(compressed))); } default Iterator decompressToByteIterator(byte[] compressed) { ret toByteIterator(runDecompressor(decompressorFromBytes(compressed))); } }